📄 uart.c
字号:
/********************************************************************************/
/* Filename: uart.c */
/* Function: Define uart transfer and receiver functions */
/********************************************************************************/
#include "UART.h"
#include "type.h"
#include <csl_gpt.h>
extern GPT_Handle hGpt;
extern unsigned short int Counter;
unsigned int Delay_Factor;
HANDLE UartChannel;
unsigned int *SendDataPtr;
/******************************************************************************/
/* delay() - 延时一段时间 */
/* */
/* 参数: */
/* 无 */
/* */
/* 返回值: 无 */
/* */
/******************************************************************************/
extern void delay(void)
{
unsigned int i;
for(i=0;i<7;i++)
{
asm(" NOP");
}
}
/******************************************************************************/
/* uart_open() - 打开相应的异步串口,获得有效的句柄 */
/* */
/* 参数: */
/* uart:选择要打开的异步串口 */
/* */
/* 返回值: 对应的有效句柄 */
/* 当返回值为0xFFFF时,为无效句柄 */
/* */
/******************************************************************************/
extern HANDLE uart_open(UartId uart)
{
int data_return;
if(uart == 0)
{
data_return = 0x10; // Uart A
return (HANDLE) data_return;
}
if(uart == 1)
{
data_return = 0x18; // Uart B
SYSCNTL1 = 0x10; // 选择外扩的UART B
delay();
return (HANDLE) data_return;
}
data_return = 0xFFFF;
return (HANDLE) data_return;
}
/********************************************************************************/
/* */
/* 函数定义: unsigned int _uart_write_reg(HANDLE channel, unsignedint reg,unsigned int regdata) */
/* 功 能: 串口初始化 */
/* 入口参数: */
/* ---- channel:串口A或是串口B */
/* 出口参数: 无 */
/* */
/********************************************************************************/
extern unsigned int uart_write_reg(HANDLE channel, unsigned int reg,unsigned int regdata)
{
if((unsigned long int)channel == 0x10) // a path
{
(*(volatile unsigned int *)(chanel_a+reg)) = regdata;
delay();
}
else // b path
{
(*(volatile unsigned int *)(chanel_b+reg)) = regdata;
delay();
}
return(OK);
}
/******************************************************************************/
/* uart_read_reg - 读取串口控制寄存器 */
/* */
/* 参数: */
/* channel: 选择要打开的异步串口 */
/* reg : 寄存器的相对地址 */
/* */
/* 返回值: 所对应的寄存器值 */
/* */
/* */
/******************************************************************************/
extern unsigned int uart_read_reg(HANDLE channel, unsigned int reg)
{
unsigned int RegValue;
if((unsigned long int)channel == 0x10) // a path
{
RegValue = (*(volatile unsigned int *)(chanel_a+reg));
}
else // b path
{
RegValue = (*(volatile unsigned int *)(chanel_b+reg));
}
return (RegValue);
}
/******************************************************************************/
/* uart_setup() - 设置串口通讯的状态,并设置其各寄存器默认值 */
/* */
/* 参数: */
/* Channel: 有效的串口句柄 */
/* UartBaud: 设置串口的波待率 */
/* UartWordLen: 设置字长 */
/* UartStopBits: 设置停止位 */
/* UartParity: 设置较验位 */
/* UartFifoControl:设置FIFO的状态 */
/* UartLoopway: 是否进行自闭环测试 */
/* */
/* 返回值: - 无 */
/* */
/******************************************************************************/
extern void uart_setup(HANDLE Channel,
unsigned int UartBaud,
unsigned int UartWordLen,
unsigned int UartStopBits,
unsigned int UartParity,
unsigned int UartFifoControl,
unsigned int UartLoopway)
{
unsigned int baudrateh,baudratel;
unsigned int uartdata;
/* 确定延时系数 */
Delay_Factor = UartBaud;
/*设置波待率分频数为1*/
uart_write_reg(Channel,lcr,0xBF);
uart_write_reg(Channel,efr,0x10);
uart_write_reg(Channel,lcr,0x0);
uart_write_reg(Channel,mcr,0x0);
/*使能波待率设置寄存器*/
uart_write_reg(Channel,lcr,0x80);
/*设置波特率低位*/
baudratel = UartBaud & 0xff;
uart_write_reg(Channel,dll,baudratel);
/*设置波特率高位*/
baudrateh = (UartBaud & 0xff00) >>8;
uart_write_reg(Channel,dlh,baudrateh);
/*关闭波待率设置寄存器*/
uart_write_reg(Channel,lcr,0x00);
/*设置数据格式*/
uartdata = UartWordLen + UartStopBits + UartParity;
uart_write_reg(Channel,lcr,uartdata);
/*设置FIFO参数*/
uart_write_reg(Channel,fcr,fifo_rreset);
uart_write_reg(Channel,fcr,UartFifoControl);
/*是否为闭环测试*/
uart_write_reg(Channel,mcr,UartLoopway);
}
/******************************************************************************/
/* uart_interrupt_control() - 串口中断设置,并设置相应的寄存器默认值 */
/* */
/* 参数: */
/* Channel: 有效的串口句柄 */
/* UartIntr: 设置串口的中断源 */
/* */
/* 返回值: */
/* 操作成功,返回0 */
/* 操作失败,返回-1 */
/* */
/******************************************************************************/
extern void uart_interrupt_control( HANDLE Channel,
unsigned int UartIntr)
{
if((unsigned long int)Channel == 0x10)
{
/*清空UART的状态位*/
uart_read_reg((HANDLE)0x10,lsr);
/*设置中断源*/
uart_write_reg(Channel,ier,UartIntr);
/*设置A通路中断使能*/
uart_write_reg((HANDLE)0x10,mcr,0x49);
}
if((unsigned long int)Channel == 0x18)
{
/*清空UART的状态位*/
uart_read_reg((HANDLE)0x18,lsr);
/*设置中断源*/
uart_write_reg(Channel,ier,UartIntr);
/*设置B通路中断使能*/
uart_write_reg((HANDLE)0x18,mcr,0x49);
}
}
/******************************************************************************/
/* max3610_set() - MAX3310的设置,并设置相应的寄存器默认值 */
/* */
/* 参数: */
/* Channel:有效的串口句柄 */
/* FastSet: 设置串口的通讯速度限制 */
/* HpdsSet: 设置串口的全双工,还是半双工 */
/* */
/* 返回值 */
/* */
/******************************************************************************/
extern void max3160_set( HANDLE Channel,
unsigned int FastSet,
unsigned int HdplxSet)
{
unsigned int max3310t;
/*保存当前的寄存器设置*/
max3310t = uart_read_reg(Channel,mcr);
max3310t = (max3310t || (FastSet + HdplxSet<<4));
/*更新设置*/
uart_write_reg(Channel,mcr,max3310t);
}
/******************************************************************************/
/* uart_send_sigle() - 查询方式下串口发送一个数据 */
/* */
/* 参数: */
/* Channel:有效的串口句柄 */
/* send_data: 要发送的数据 */
/* */
/* 返回值 */
/* */
/******************************************************************************/
extern void uart_send_sigle(HANDLE Channel,unsigned int send_data)
{
unsigned int lsrdata;
do
{
lsrdata = uart_read_reg(Channel,lsr);
}
while((lsrdata & 0x40) != 0x40);
uart_write_reg(Channel,thr,send_data);
}
/******************************************************************************/
/* Myuart_Send() - 在查询方式下串口发送多个数据(由定时器控制数据发送) */
/* */
/* 参数: */
/* Channel:有效的串口句柄 */
/* longth: 缓冲区的长度 */
/* send_data: 缓冲区的首址 */
/* */
/* 返回值 */
/* */
/******************************************************************************/
extern void Myuart_Send(HANDLE Channel,
unsigned int longth,
unsigned int *send_data)
{
Counter = 0; // 字符发送计数器清0
SendDataPtr = send_data;
UartChannel = Channel;
GPT_start(hGpt); // 启动定时器,开始计时
do
{
}
while(!(Counter>=longth));
GPT_stop(hGpt); // 停止定时器
}
/******************************************************************************/
/* uart_receive_single() - 中断方式下串口接收单个数据 */
/* */
/* 参数: */
/* Channel: 有效的串口句柄 */
/* */
/* 返回值 接收到的数据 */
/******************************************************************************/
extern unsigned int uart_receive_single(HANDLE Channel)
{
unsigned int RegValue;
unsigned int j;
for(j=0;j<1000;j++)
{
asm(" NOP");
}
if((unsigned long int)Channel == 0x10)
{
/* 读接收保持寄存器 */
RegValue = uart_read_reg((HANDLE)0x10,rhr);
return(RegValue);
}
if((unsigned long int)Channel == 0x18)
{
/* 读接收保持寄存器 */
RegValue = uart_read_reg((HANDLE)0x18,rhr);
return(RegValue);
}
else return(OK) ;
}
/*******************************************************************************************/
// No more
/*******************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -