📄 zlg500s_comm.c
字号:
#define ZLG500S_COMM_GLOBALS
#include "config.h"
#include "Zlg500S.h"
#include "zlg500S_comm.h"
void __irq UART_Isr(void);
INT8U SetBaud()
{
INT16U temp;
INT8U SetCunt = 3;
while(SetCunt)
{
U0THR = STX;
while((U0LSR & 0x40) == 0);
for(temp=600;temp>0;temp--); //延时30us
U0THR = STX;
while((U0LSR & 0x40) == 0);
WaitRespDly = ZLG500S_DELAY_10ms;
while((U0LSR & 0x01) == 0 && WaitRespDly);
if(WaitRespDly == 0)
{
SetCunt--;
continue;
}
else
{
temp = U0RBR;
if(temp == ACK)
return TRUE;
else
{
SetCunt--;
continue;
}
}
}
return FALSE;
}
void __irq UART0_Isr(void)
{
INT8U i;
switch(U0IIR & 0x0f)
{
case 0x02: //发送缓冲区空
if(SerBfrIdx < SerBfr[FRAMELEN])
{
for(i=0;i<16;i++)
{
U0THR = SerBfr[SerBfrIdx];
SerBfrIdx++;
if(SerBfrIdx == SerBfr[FRAMELEN])
break;
}
}
else
{
SerBfrIdx = 0; //发送完毕
U0IER = 0x01; //禁止THRE中断,使能RBR中断
}
break;
case 0x04: //接收数据可用
case 0x0c: //接收超时
while(U0LSR & 0x01)
{
SerBfr[SerBfrIdx] = U0RBR;
if(SerBfrIdx == FRAMELEN)
{
if(SerBfr[FRAMELEN] < PRTCLEN || SerBfr[FRAMELEN] > MAXSERSIZE)
{
continue;
}
}
SerBfrIdx++;
}
if(SerBfrIdx >= SerBfr[FRAMELEN])
{
SerDTvalid = TRUE;
SerBfrIdx = 0;
}
break;
default:
break;
}
VICVectAddr = 0;
}
void ZLG500S_COMM_Init()
{
INT16U Fdiv;
PINSEL0 = (PINSEL0 & 0xfffffff0) | 0x05; //设置管脚RXD,TXD功能
U0LCR = 0x83; //使能访问除数锁存寄存器
Fdiv = (Fpclk/16)/BAUDRATE;
U0DLM = Fdiv >> 8;
U0DLL = Fdiv & 0x00ff;
U0LCR = 0x03; //8位数据,1位停止位,无校验
SerDTvalid = FALSE;
SetBaud();
U0FCR = 0x81; //FIFO使能,Rx触发8字节
VICIntSelect &= ~(1 << 6); //设置UART中断通道为IRQ
VICVectAddrZLG500SUART = (uint32)UART0_Isr; //ZLG500S中断矢量地址初始化
VICVectCntlZLG500SUART = 0x20 | 6;
VICIntEnable = 1 << 6;
}
INT8U Ser_Rcv()
{
INT8U i,BCC;
INT8U Status = FALSE;
if(SerDTvalid)
{ //已接收一帧数据,进行数据校验
if(SerBfr[SerBfr[FRAMELEN]-1] == ETX && SerBfr[FRAMELEN] == (SerBfr[LENGTH]+PRTCLEN))
{ //且正确接收到ETX,及帧长度等于数据长度加协议长度,则数据有效
BCC = 0;
for(i=0; i<(SerBfr[FRAMELEN]-1); i++)
{
BCC ^= SerBfr[i];
}
if(BCC == 0xff)
Status = TRUE; //BCC校验通过
}
SerDTvalid = FALSE;
}
return Status;
}
INT8U Ser_Send()
{
INT8U i,BCC;
SerBfr[FRAMELEN] = SerBfr[LENGTH]+PRTCLEN; //帧长度等于数据长度加协议长度
BCC = 0;
for(i=0; i<(SerBfr[FRAMELEN]-2); i++)
BCC ^= SerBfr[i];
SerBfr[SerBfr[FRAMELEN]-2] = ~BCC;
SerBfr[SerBfr[FRAMELEN]-1] = ETX;
SerBfrIdx = 0;
for(i=0;i<16;i++)
{
U0THR = SerBfr[SerBfrIdx];
SerBfrIdx++;
if(SerBfrIdx == SerBfr[FRAMELEN])
break;
}
U0IER = 0x02; //使能THRE中断,禁止RBR中断
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -