📄 xr16l784.c
字号:
#include "IMU_GW.h"
/***************************************
函数: Initialize_XR16LChip
功能: 初始化串口芯片
***************************************/
void Initialize_XR16LChip()
{
unsigned char i;
*(unsigned char *)(XR16L_BASE_ADDR + XR16L_RESET_REG_OFFSET) = 0x00;
for(i=200;i<=0;i--);
*(unsigned char *)(XR16L_BASE_ADDR + XR16L_RESET_REG_OFFSET) = 0x01;/*复位芯片*/
for(i=100;i<=0;i--);
*(unsigned char *)(XR16L_BASE_ADDR + XR16L_X8MODE_REG_OFFSET)= 0x00;/*使用默认的X16*/
IRQ_enable(IRQ_EVT_EXTINT4); /*启动XR16L784中断4*/
IRQ_hook(IRQ_EVT_EXTINT4,ext4_isr);
init_timer1
}
/***************************************
函数: Initialize_XR16L_Chan
功能: 初始化串口芯片中的一个通道
输入: chan 一个芯片上的串口通道号,为0,1,2,3
***************************************/
void Initialize_XR16L_Chan(unsigned char chan)
{
volatile unsigned char * pChan;
pChan = (unsigned char *)(XR16L_BASE_ADDR + XR16L_CH0_REG_ADDR_OFFSET + chan * XR16L_CH_LENGTH);
/*通道的MCR[7]使用默认值(0),设定DLM和DLL,选定38400作为波特率*/
*(unsigned char *)(pChan + XR16L_CH_EFR_OFFSET) |= 0x10;
*(unsigned char *)(pChan + XR16L_CH_MCR_OFFSET) |= 0x00; /*460800波特率,0x00, MCR[7] = 1*/
*(unsigned char *)(pChan + XR16L_CH_LCR_OFFSET) |= 0x80; /*LCR[7] = 1*/
*(unsigned char *)(pChan + XR16L_CH_DLL_OFFSET) = 0x01; /*460800波特率,0x0C */
*(unsigned char *)(pChan + XR16L_CH_DLM_OFFSET) = 0x00;
*(unsigned char *)(pChan + XR16L_CH_LCR_OFFSET) &= 0x7F; /*LCR[7] = 0*/
*(unsigned char *)(pChan + XR16L_CH_LCR_OFFSET) |= 0x03;/*发送数据字长为8位*/
*(unsigned char *)(pChan + XR16L_CH_FCTR_OFFSET) = 0xC0;/*设置FCTR[7,6]为11,选定Table D*/
*(unsigned char *)(pChan + XR16L_CH_FCR_OFFSET) = 0x57;/*启动接收与发送FIFO,复位FIFO,不设定DMA*/
*(unsigned char *)(pChan + XR16L_CH_TXTRG_OFFSET)= 58; /*设定接收,发送FIFO的触发点*/
*(unsigned char *)(pChan + XR16L_CH_RXTRG_OFFSET)= 50;
*(unsigned char *)(pChan + XR16L_CH_IER_OFFSET) = 0x01; /*启动接收中断*/
}
/***************************************
函数: ext4_isr
功能: 串口芯片的中断服务程序
***************************************/
interrupt void ext4_isr()
{
unsigned char intChanNum;
volatile unsigned char intReason;
unsigned char data,dataNum,i;
volatile unsigned char * pchan;
intChanNum = *((unsigned char *)(XR16L_BASE_ADDR + XR16L_INT0_REG_OFFSET));
while(intChanNum)
{
if((intChanNum & 0x01) !=0)
{
pchan = (unsigned char *)(XR16L_BASE_ADDR + XR16L_CH0_REG_ADDR_OFFSET);
intReason = *((unsigned char *)(pchan + XR16L_CH_ISR_OFFSET));
if((intReason & 0x04) !=0) /*接收到数据,超时或者正常*/
{
dataNum = *((unsigned char *)(pchan + XR16L_CH_RXCNT_OFFSET));
for(i = 0; i < dataNum; i++)
{
data = *((unsigned char *)(pchan + XR16L_CH_RHR_OFFSET));
printf("XR16L784 channel 0 receive data %x !\n", data);
}
}
}
if((intChanNum & 0x02) !=0)
{
pchan = (unsigned char *)(XR16L_BASE_ADDR + XR16L_CH1_REG_ADDR_OFFSET);
intReason = *((unsigned char *)(pchan + XR16L_CH_ISR_OFFSET));
if((intReason & 0x04) !=0)/*接收到数据,超时或者正常*/
{
dataNum = *((unsigned char *)(pchan + XR16L_CH_RXCNT_OFFSET));
for(i = 0; i < dataNum; i++)
{
data = *((unsigned char *)(pchan + XR16L_CH_RHR_OFFSET));
//printf("XR16L784 channel 1 receive data %x !\n", data);
}
}
}
if((intChanNum & 0x04) !=0)
{
pchan = (unsigned char *)(XR16L_BASE_ADDR + XR16L_CH2_REG_ADDR_OFFSET);
intReason = *((unsigned char *)(pchan + XR16L_CH_ISR_OFFSET));
if((intReason & 0x04) !=0)/*接收到数据,超时或者正常*/
{
dataNum = *((unsigned char *)(pchan + XR16L_CH_RXCNT_OFFSET));
for(i = 0; i < dataNum; i++)
{
data = *((unsigned char *)(pchan + XR16L_CH_RHR_OFFSET));
//printf("XR16L784 channel 2 receive data %x !\n", data);
}
}
}
if((intChanNum & 0x08) !=0)
{
pchan = (unsigned char *)(XR16L_BASE_ADDR + XR16L_CH3_REG_ADDR_OFFSET);
intReason = *((unsigned char *)(pchan + XR16L_CH_ISR_OFFSET));
if((intReason & 0x04) !=0)/*接收到数据,超时或者正常*/
{
dataNum = *((unsigned char *)(pchan + XR16L_CH_RXCNT_OFFSET));
for(i = 0; i < dataNum; i++)
{
data = *((unsigned char *)(pchan + XR16L_CH_RHR_OFFSET));
//printf("XR16L784 channel 3 receive data %x !\n", data);
}
}
}
intChanNum = *((unsigned char *)(XR16L_BASE_ADDR + XR16L_INT0_REG_OFFSET));
}
}
/***************************************
函数: XR16L_SendData
功能: 通过串口发送数据
输入: chan 一个芯片上的串口通道号,为0,1,2,3
pdata 发送数据区的首地址(字节地址)
datanum 发送数据量(按字节来算)
输出: 无
***************************************/
void XR16L_SendData( Uint8 chan, Uint8* pdata, Uint32 datanum)
{
unsigned short i;
unsigned char temp,j;
volatile unsigned char * pChan;
pChan = (unsigned char *)(XR16L_BASE_ADDR + chan * XR16L_CH_LENGTH);
for(i = 0; i < datanum; i++)
{
temp = *(unsigned char*)(pChan + XR16L_CH_LSR_OFFSET);
while((temp & 0x20) == 0x00)/*检测发送缓冲区是否可用*/
{
temp = *(unsigned char *)(pChan + XR16L_CH_LSR_OFFSET);
}
j = *(pdata+i);
*(unsigned char *)(pChan + XR16L_CH_THR_OFFSET) = j;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -