/*
**********************************************************************************************
* DVG02项目的LIN总线分析文件
* 文件名称: LIN.c
* 版本号 : V0.9
* 编写人 : Rock.Wu
* 编写日期:2012-08-20
**********************************************************************************************
*/
#define LIN_MODULE
/*******************************包含的文件******************************/
#include <includes.h>
#include <cpu.h>
#include <LIN.h>
/*******************************宏定义************************************/
#define BIT(A,B) ((A>>B)&0x01)
#define LIN_RXCMD_BUF_SIZE 5 /*接受缓存大小10个报文*/
/*******************************数据类型定义***************************/
/*******************************变量定义*********************************/
enum LinState{
IDLE,
SYNCH,
ID_LEN,
DATA_GET,
CHECKSUM
};
enum LinErrState{
NO_ERR,
SYNC_ERR,
ID_ERR,
CHKSUM_ERR
};
static INT8U AnalysePlus4 = IDLE;
#if (LIN_LEN_MODE == 0)
static const INT8U LIN_Len[4]={2, 2, 4, 8};
#endif
static LINDataType TempLinData;
LINDataType LINRxMsgBuf[LIN_RXCMD_BUF_SIZE];
COMM_LIN_Q LIN_RxMsg;
extern CMD_LINType const LIN_CMD[LIN_ID_NUM];
static INT8U SendDataLen =0;
static INT8U LinSendBuf[9]={0,0,0,0,0,0,0,0,0};
/*******************************函数声明*********************************/
static void LIN_IRQ_Handler(void);
static void LIN_Rx_Analyse(INT8U LIN_Data);
/******************************************************************************
** 功能描述: 初始化UART4,用于与LIN通讯
** 输 入:
** 全局变量: UART1Sem
** 调用模块:
** 编写人 : Rock.Wu
** 编写日期:2012-09-14
*******************************************************************************/
void BSP_LIN_Init(void)
{
USART_InitTypeDef USART_InitStructure;/*串口设置恢复默认参*/
GPIO_InitTypeDef GPIO_InitStructure;
INT8U i,j;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
USART_InitStructure.USART_BaudRate = 19200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(UART4, &USART_InitStructure);
USART_LINBreakDetectLengthConfig(UART4, USART_LINBreakDetectLength_11b);
USART_LINCmd(UART4, ENABLE);
USART_Cmd(UART4, ENABLE);
USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);/*先使能接收中断*/
USART_ITConfig(UART4, USART_IT_TXE, DISABLE); /*先禁止发送中断*/
USART_ITConfig(UART4, USART_IT_LBD, ENABLE);/*先使能LIN间隔场检测到中断*/
BSP_IntVectSet(BSP_INT_ID_UART4, LIN_IRQ_Handler);
BSP_IntPrioSet(BSP_INT_ID_UART4, 1);
BSP_IntEn(BSP_INT_ID_UART4);
TempLinData.ErrorType = NO_ERR;
for(i=0;i<LIN_RXCMD_BUF_SIZE;i++) /*初始化接收队列数据*/
{
LINRxMsgBuf[i].CMD_ID = 0;
LINRxMsgBuf[i].Len = 0;
for(j=0;j<8;j++)
LINRxMsgBuf[i].Data[j]=0;
}
COMM_LIN_QCreate(&LIN_RxMsg, LINRxMsgBuf, LIN_RXCMD_BUF_SIZE); /*创建队列*/
}
/**************************************************************************************
** 功能描述: UART4 LIN 通讯接收发送中断服务程序
** 全局变量:
** 调用模块:
** 编写人 : Rock.Wu
** 编写日期:2012-09-14
**************************************************************************************/
static void LIN_IRQ_Handler(void)
{
if(USART_GetITStatus(UART4, USART_IT_LBD) != RESET)
{
USART_ClearITPendingBit(UART4, USART_IT_LBD);/*清除LIN间隔场检测标志*/
AnalysePlus4 = SYNCH;/*确认检测到间隔场下一个开始接收
的是同步场数据*/
TempLinData.ErrorType = NO_ERR;
TempLinData.WorkMode = SLAVE_IDLE;
USART_ITConfig(UART4, USART_IT_TXE, DISABLE); /*先禁止发送中断*/
}
if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(UART4, USART_IT_RXNE);/*清除接收中断标志*/
LIN_Rx_Analyse((INT8U)USART_ReceiveData(UART4));
}
/*溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入*/
if(USART_GetFlagStatus(UART4, USART_FLAG_ORE)==SET)
{
USART_ClearFlag(UART4, USART_FLAG_ORE); /*读SR其实就是清除标志*/
USART_ReceiveData(UART4);/*读DR*/
}
if(USART_GetITStatus(UART4, USART_IT_TXE) != RESET)
{
USART_ClearITPendingBit(UART4, USART_IT_TXE);/*清除接收中断标志*/
if((LINTempData.WorkMode == SLAVE_TX_MODE)&&(SendDataLen != 0))
{
SendDataLen--;/*这个必须防在先面的发送函数前才能得到
正确的数据,因为之前它加了1*/
USART_SendData(UART4, ((u16) LinSendBuf[SendDataLen]));
}else{
SendDataLen = 0;
LINTempData.WorkMode = SLAVE_IDLE;
USART_ITConfig(UART4, USART_IT_TXE, DISABLE); /*先禁止发送中断*/
}
}
}
/**************************************************************************************
** 功能描述: UART4 LIN 通讯接收解析服务程序
** 全局变量:
** 调用模块:
** 编写人 : Rock.Wu
** 编写日期:2012-09-17
**************************************************************************************/
static void LIN_Rx_Analyse(INT8U LIN_Data)
{
INT8U TempData = 0, TempNum = 0;
static INT8U TempLen = 0;
static INT16U TempCheckSum = 0;
switch(AnalysePlus4)
{
case 1:
if(LIN_Data == 0x55)
{
AnalysePlus4 = ID_LEN;/*下一个将接收ID信息*/
}else{
AnalysePlus4 = IDLE;
TempLinData.ErrorType = SYNC_ERR;
}
break;
case 2:
TempData = (~(BIT(LIN_Data,1)^BIT(LIN_Data,3)^BIT(LIN_Data,4)^BIT(LIN_Data,5)))<<7;
TempData |= (BIT(LIN_Data,0)^BIT(LIN_Data,1)^BIT(LIN_Data,2)^BIT(LIN_Data,4))<<6;
if(TempData == (LIN_Data&0xC0))
{
TempLinData.CMD_ID = LIN_Data;
#if (LIN_CHECKSUM_MODE == 0)
TempCheckSum = 0;
#else
TempCheckSum = TempLinData.CMD_ID;
#endif
for(TempNum = 0; TempNum < LIN_ID_NUM; TempNum++)
{
if(TempLinData.CMD_ID == LIN_ID_List[TempNum][0])
{
TempLinData.WorkMode = LIN_ID_List[TempNum][1];
#if (LIN_LEN_MODE == 0)
TempLinData.Len = LIN_Len[((LIN_Data>>4)&0x03)];
#else
TempLinData.Len = LIN_ID_List[TempNum][2];
#endif
if(TempLinData.WorkMode == SLAVE_RX_MODE)
{
TempLen = 1;
- 1
- 2
- 3
- 4
- 5
- 6
前往页