#include "public.h"
static volatile uchar Usart_Rx_Len;
static volatile USART_RX_STATE Usart_Rx_State;
void USART_Init (void)
{
u32 BaudRate_Mantissa, BaudRate_Mantissa100;
u32 CLK_Freq,BaudRate;
uchar temp;
USART_CR1 = USART_DEFAULT_PARAM1; /*Load Default value*/
USART_CR2 = USART_DEFAULT_PARAM2;
USART_CR3 = USART_DEFAULT_PARAM3;
USART_CR4 = 0;
USART_CR5 = 0;
USART_DR = 0;
USART_CR2 |=(USART_TX_ENABLE|USART_RX_ENABLE);/*Sets SCI in the required mode*/
USART_CR2 |=USART_TRANSMITTER_COMPLETE_INT_ENABLE|USART_RECEIVE_INT_ENABLE;
temp=USART_SR; /*Clear all the flags in Status register*/
temp=USART_DR;
CLK_Freq=(u32)8000000;
BaudRate=(u32)19200;
BaudRate_Mantissa = ((u32)CLK_Freq/ (BaudRate << 4));
BaudRate_Mantissa100 = (((u32)CLK_Freq* 100) / (BaudRate << 4));
USART_BRR2= (u8)((u8)(((BaudRate_Mantissa100 - (BaudRate_Mantissa * 100)) << 4) / 100) & (u8)0x0F); /**< Set the fraction of USARTDIV */
USART_BRR2|= (u8)((BaudRate_Mantissa >> 4) & (u8)0xF0); /**< Set the MSB mantissa of USARTDIV */
USART_BRR1|= (u8)BaudRate_Mantissa; /**< Set the LSB mantissa of USARTDIV */
Usart_Rx_State = RX_HEAD_CODE1;
}
void USART_RxTx_Init(void)
{
USART_Init();
USART_Tx_Ptr=USART_Tx_Buff;
PtrToUsartBuffRx=USART_Rx_Buff;
F_Usart_Rx_Data_Ready=0;
Usart_Rx_Len=0;
}
void USART_Ack_Pro(uchar ackchar)
{
if(F_Lin_TxBuff_Full==0||F_Lin_TxBuff2_Full==0)
{ //发送 ACK
uchar *Write_Ptr;
if(F_Lin_TxBuff_Full==0)
{
Write_Ptr=Lin_Tx_Buff;
F_Lin_TxBuff_Full=1;
}
else
{
Write_Ptr=Lin_Tx_Buff2;
F_Lin_TxBuff2_Full=1;
}
*Write_Ptr=LIN_ADDRESS_MCU;
Usart_Tx_Checksum=LIN_ADDRESS_MCU;
Write_Ptr++;
*Write_Ptr=LIN_ADDRESS_WINCE;
Usart_Tx_Checksum^=LIN_ADDRESS_WINCE;
Write_Ptr++;
*Write_Ptr=Lin_Rx_Seq_Num;
Usart_Tx_Checksum^=Lin_Rx_Seq_Num;
Write_Ptr++;
*Write_Ptr=ackchar;
Usart_Tx_Checksum^=ackchar;
Write_Ptr++;
*Write_Ptr=6; //数据包的长度
Usart_Tx_Checksum^=6;
Usart_Tx_Checksum^=0xff;
Write_Ptr++;
*Write_Ptr=Usart_Tx_Checksum;
Lin_Tx_Length=6;
LinUart_Start_Tx();
}
}
static uchar GRoup_ID;
ext void USART_Rx_Interrupt(void)
{
static uchar Usart_Rx_Checsum;
static uchar Usart_Data;
uchar temp_sr=USART_SR;
if(temp_sr & USART_OR) /*If Interrupt is generated due to overrun error*/
{
temp_sr = USART_DR;
}
else if (temp_sr & USART_RXNE) //Received data successfully
{
switch (Usart_Rx_State)
{
case RX_HEAD_CODE1:
Usart_Data = USART_DR;
if(Usart_Data == USART_HEAD_CODE)
{
Usart_Rx_State = RX_LENGTH;
PtrToUsartBuffRx=USART_Rx_Buff;
}
break;
case RX_LENGTH:
Usart_Data = USART_DR;
Usart_Rx_Len=Usart_Data+2;
*PtrToUsartBuffRx = Usart_Data;
PtrToUsartBuffRx++;
Usart_Rx_Checsum=Usart_Data;
Usart_Rx_State=RX_DATA;
break;
case RX_DATA:
*PtrToUsartBuffRx = USART_DR;
PtrToUsartBuffRx++;
Usart_Rx_Len--;
if(Usart_Rx_Len == 0)
{
Usart_Rx_State = RX_HEAD_CODE1;
PtrToUsartBuffRx=USART_Rx_Buff;
if( Usart_Rx_Checsum==0XFF)
{
F_Usart_Rx_Data_Ready=1;
USART_CR2 &= (uchar)(~(uchar)USART_RXNE);
}
}
else
{
Usart_Rx_Checsum += (uchar)USART_DR;
}
break;
default:
break;
}
}
}
ext void USART_Tx_Interrupt(void)
{
if(USART_SR & USART_TC)
{
if(USART_Tx_Length!=0)
{
USART_Tx_Length--;
if(USART_Tx_Length==0)
{
USART_CR2 &=~USART_TX_ENABLE;
USART_CR2 &=~USART_TRANSMITTER_COMPLETE_INT_ENABLE;
return;
}
USART_Tx_Ptr++;
USART_DR=*USART_Tx_Ptr;
}
else
{
USART_CR2 &=~USART_TX_ENABLE;
USART_CR2 &=~USART_TRANSMITTER_COMPLETE_INT_ENABLE;
}
}
}
#ifdef CAN_BUS_FUNCTION_BY_ADAPTER
typedef enum
{
SWC_NOKEY=0,
SWC_MUTE=1,
SWC_VOL_UP=2,
SWC_VOL_DOWN=3,
SWC_PRESET_UP=4,
SWC_PRESET_DOWN=5,
SWC_SRC=6,
SWC_SEEK=7
}SWC_KEY;
const uchar SWC_KeyCode_tab[8]=
{
UICC_NOP,
UICC_MUTE,
UICC_VOLUME_UP,
UICC_VOLUME_DOWN,
UICC_SMART_CW,
UICC_SMART_CCW,
UICC_SOURCE,
UICC_SKIPB
};
ext const uchar Reflash_CanBox_CMD[]={7,0xaa,0x03,0x8b,0,0,0x71,0xaa};
ext const uchar Query_CanBox_CMD[]= {5,0xaa,0x01,0x90,0x6e,0xaa};
//CAN_BOX_HEAD
ext void Send_Cmd_To_CanBox(uchar *buf)
{
uchar length;
uchar *target;
uchar len;
length=*buf;
len =length;
buf++;
target= &USART_Tx_Buff[0];
USART_Tx_Length=length;
for (; length > 0 ; length--)
{
*target = *buf;
buf++; //Moves the pointer to the next location
target++;
}
USART_Start_Tx();
}
ext void Query_CanBox_Connection(void)
{
uchar i,j;
j=0;
i=Query_CanBox_CMD[0];
while (i!=0)
{
USART_Tx_Buff[j]=USART_Tx_Buff[j+1];
j++;
i--;
}
USART_Tx_Length=Query_CanBox_CMD[0];
USART_Start_Tx();
}
ext void USART_Data_Analyse(void)
{
uchar *ptr,*src,*ptx;
uchar i;
if(F_Usart_Rx_Data_Ready==1)
{
F_Usart_Rx_Data_Ready=0;
#ifdef CAN_ADAPTER_UPDATE_FUNCTION
if(F_Req_CanBox_Update==1)
{
if(USART_Rx_Buff[0]=3&&USART_Rx_Buff[1]==SPI_TX_REFLASH_CFM)
{
PostEvent(MPEG_MODULE,SPI_TX_CANBOX_RELAY,NONE);
dvdp_IAP_timer=12; //12*8==96ms
}
}
else
#endif
if(F_Can_Box_Exist==1)
{
if(USART_Rx_Buff[1]==CAN_NEW_MSG)
{
ptr=&Car_Status.CanFlag.Can_Flag;
ptx=USART_Tx_Buff;
src=USART_Rx_Buff;
*ptx=USART_HEAD_CODE;
ptx++;
for(i=0;i<sizeof(CAR_STATUS);i++)
{
*ptr=*src;
*ptx=*src;
ptr++;
ptx++;
src++;
}
*ptx=*src;
PtrToUsartBuffRx=USART_Rx_Buff;
USART_Tx_Length=sizeof(CAR_STATUS)+4;
USART_Start_Tx();
USART_CR2 |= USART_RXNE;
i=Car_Status.CanFlag.bit.Steer_Key;
PostEvent(MMI_MODULE,SWC_KeyCode_tab[i],REMOTE);
}
}
else
{ //exist can box
if(USART_Rx_Buff[1]==EVT_CANBOX_ACK)
{
F_Can_Box_Exist=1;
}
}
USART_CR2 |= USART_RXNE;
}
}
ext void USART_Start_Tx(void)
{
USART_Tx_Ptr=USART_Tx_Buff;
USART_DR=*USART_Tx_Ptr;
USART_CR2 |=(USART_TX_ENABLE|USART_TRANSMITTER_COMPLETE_INT_ENABLE);
}
#endif
Uart_Driver.rar_STM8 串口
版权申诉
52 浏览量
2022-09-21
18:55:26
上传
评论
收藏 4KB RAR 举报
钱亚锋
- 粉丝: 87
- 资源: 1万+
最新资源
- 品四.m4a..mp3
- 财政学知识点归纳 & 复习题及答案
- 2023-04-06-项目笔记 - 第一百二十八阶段 - 4.4.2.126全局变量的作用域-126 -2024.05.09
- Excel表格筛选工具
- liang新版nacos本地使用方法.zip
- 基于JSP毕业设计-网络购物中心毕业设计(源代码+论文).zip
- 直流电机电磁计算软件Excel版.xlsx
- 1694jsp宿舍管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目源码
- 基于JSP毕业设计-数据库连接池的研究与实现(源代码+论文).zip
- Arduino IDE 2.3.2 windows 64位版本
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈