📄 sc16is752.c
字号:
/*******************************************************************************
** TunnelerLamperEXcom **
** Device: SC16IS725 **
** Handson <2008.07.15> **
*******************************************************************************/
#include "def.h" // 类型定义文件
#include "config.h" // 配置头文件
#include "at24c02.h" // at24c02驱动程序头文件
#include "sc16is752.h"
#include "uart0.h" // uart0通讯程序头文件
#define uartSC16IS752A_rbuf_size 512 // ChannelA接收缓冲区长度
#define uartSC16IS752A_tbuf_size 256 // ChannelA发送缓冲区长度
#define uartSC16IS752B_rbuf_size 512 // ChannelB接收缓冲区长度
#define uartSC16IS752B_tbuf_size 256 // ChannelB发送缓冲区长度
// *** 全局变量定义 ***
//CHANEL A
volatile uchar uartSC16IS752A_rbuf[uartSC16IS752A_rbuf_size]; // ChannelA接收缓冲区(循环队列)
volatile uint uartSC16IS752A_sptr; // ChannelA接收缓冲区当前帧起始指针
volatile uint uartSC16IS752A_rptr; // ChannelA接收缓冲区读指针
volatile uint uartSC16IS752A_wptr; // ChannelA接收缓冲区写指针
volatile uint uartSC16IS752A_head; // uart0帧位置计数
volatile uint uartSC16IS752A_flag; // uart0帧接收标志
volatile uint uartSC16IS752A_leng; // uart0帧数据长度
volatile uint uartSC16IS752A_aval; // uart0帧有效标记
volatile uchar uartSC16IS752A_cksm; // uart0帧总校验和
volatile uint uartSC16IS752A_over; // uart0超时计数器
volatile uchar uartSC16IS752A_tbuf[uartSC16IS752A_tbuf_size]; // uart0发送缓冲区(单队列)
volatile uint uartSC16IS752A_tptr; // uart0发送缓冲区读写指针
volatile uint uartSC16IS752A_tlen; // uart0发送数据长度
volatile uint uartSC16IS752A_tsdy; // uart0开始发送延时
volatile uint uartSC16IS752A_tddy; // uart0结束发送延时
volatile uchar uartSC16IS752A_ack_buff[256]; // 应答缓冲区
volatile uchar uartSC16IS752A_type; // 第二设备种类
volatile uchar uartSC16IS752A_addr; // 第二设备地址
volatile uchar uartSC16IS752A_cmmd; // 命令码
volatile uint uartSC16IS752A_prcy; // 前一次通讯周期
volatile uchar uartSC16IS752A_cycl; // 当前通讯周期
//CHANEL B
volatile uchar uartSC16IS752B_rbuf[uartSC16IS752A_rbuf_size]; // uart0接收缓冲区(循环队列)
volatile uint uartSC16IS752B_sptr; // uart0接收缓冲区当前帧起始指针
volatile uint uartSC16IS752B_rptr; // uart0接收缓冲区读指针
volatile uint uartSC16IS752B_wptr; // uart0接收缓冲区写指针
volatile uint uartSC16IS752B_head; // uart0帧位置计数
volatile uint uartSC16IS752B_flag; // uart0帧接收标志
volatile uint uartSC16IS752B_leng; // uart0帧数据长度
volatile uint uartSC16IS752B_aval; // uart0帧有效标记
volatile uchar uartSC16IS752B_cksm; // uart0帧总校验和
volatile uint uartSC16IS752B_over; // uart0超时计数器
volatile uchar uartSC16IS752B_tbuf[uartSC16IS752A_tbuf_size]; // uart0发送缓冲区(单队列)
volatile uint uartSC16IS752B_tptr; // uart0发送缓冲区读写指针
volatile uint uartSC16IS752B_tlen; // uart0发送数据长度
volatile uint uartSC16IS752B_tsdy; // uart0开始发送延时
volatile uint uartSC16IS752B_tddy; // uart0结束发送延时
volatile uchar uartSC16IS752B_ack_buff[256]; // 应答缓冲区
volatile uchar uartSC16IS752B_type; // 第二设备种类
volatile uchar uartSC16IS752B_addr; // 第二设备地址
volatile uchar uartSC16IS752B_cmmd; // 命令码
volatile uint uartSC16IS752B_prcy; // 前一次通讯周期
volatile uchar uartSC16IS752B_cycl; // 当前通讯周期
//***********************************************************************************
void __irq IRQ_Eint3_COM34(void);
void WriteRegister(uchar Reg,uchar channel,uchar Value);
void ReadRegister(uchar Reg,uchar channel,uchar *RegValue);
void ReadData(uchar Reg,uchar channel,uchar *Value,uchar num);
void WriteData(uchar Reg,uchar channel,uchar *Value,uchar num);
uchar ISendByte(uchar sla,uchar c);
uchar ISendStr(uchar sla,uchar suba,uchar *s,uchar no);
uchar ISendStrExt(uchar sla,uchar *s,uchar no);
//uchar IRcvByte(uchar sla,uchar *c);
uchar IRcvStr(uchar sla,uchar suba,uchar *s,uchar no);
uchar IRcvStrExt(uchar sla,uchar *s,uchar no);
void Init_SC16IS752(void);
void RecvChannelA(void);
void RecvChannelB(void);
//**************************************************************************
void uartSC16IS752A_send_nack (void);
void uartSC16IS752A_ack (void);
void uartSC16IS752A_send (uint data_leng);
void uartSC16IS752A_sendst (void);
void uartSC16IS752A_SendToDrivers (uchar iport);
void Nint_SC16IS752A (uchar iport);
void uartSC16IS752B_send (uint data_leng);
void uartSC16IS752B_sendst (void);
void uartSC16IS752B_SendToDrivers (uchar iport);
//void testSend(void);//jumpingtest
/****************************************************************************
* 名称:Init_SC16IS752()
* 功能:SC16IS75X初始化。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Init_SC16IS752(void)
{
IO0CLR = isDRE0|isDRE1; // isDRE0=1-485发送/0-485收/ isDRE1=1-485发送/0-485收
//*******************************
uartSC16IS752A_sptr = 0x00; // 复位uart0接收缓冲区当前帧起始指针
uartSC16IS752A_rptr = 0x00; // 复位uart0接收缓冲区读指针
uartSC16IS752A_wptr = 0x00; // 复位uart0接收缓冲区写指针
uartSC16IS752A_head = 0x00; // 复位uart0帧位置计数
uartSC16IS752A_flag = 0x00; // 复位uart0帧接收标志
uartSC16IS752A_leng = 0x00; // 复位uart0帧数据长度
uartSC16IS752A_aval = 0x01; // 复位uart0帧有效标记(有效)
uartSC16IS752A_cksm = 0x00; // 复位uart0帧校验和
uartSC16IS752A_over = 100; // 置uart0超时计数器初值: 50*1mS = 50mS
uartSC16IS752A_tptr = 0x00; // 复位uart0发送缓冲区读写指针
uartSC16IS752A_tlen = 0x00; // 复位uart0发送数据长度
uartSC16IS752A_tsdy = 0; // 复位uart0开始发送延时
uartSC16IS752A_tddy = 0; // 复位uart0结束发送延时
//*******************************
uartSC16IS752B_sptr = 0x00; // 复位uart0接收缓冲区当前帧起始指针
uartSC16IS752B_rptr = 0x00; // 复位uart0接收缓冲区读指针
uartSC16IS752B_wptr = 0x00; // 复位uart0接收缓冲区写指针
uartSC16IS752B_head = 0x00; // 复位uart0帧位置计数
uartSC16IS752B_flag = 0x00; // 复位uart0帧接收标志
uartSC16IS752B_leng = 0x00; // 复位uart0帧数据长度
uartSC16IS752B_aval = 0x01; // 复位uart0帧有效标记(有效)
uartSC16IS752B_cksm = 0x00; // 复位uart0帧校验和
uartSC16IS752B_over = 100; // 置uart0超时计数器初值: 50*1mS = 50mS
uartSC16IS752B_tptr = 0x00; // 复位uart0发送缓冲区读写指针
uartSC16IS752B_tlen = 0x00; // 复位uart0发送数据长度
uartSC16IS752B_tsdy = 0; // 复位uart0开始发送延时
uartSC16IS752B_tddy = 0; // 复位uart0结束发送延时
//*****ChannelA
//set the Baudrate
WriteRegister(LCR,ChannelA,0x80);//bit7 enable
WriteRegister(DLL,ChannelA,SC16_BAUD_4800_DLL);//9600bps
WriteRegister(DLH,ChannelA,SC16_BAUD_4800_DLH);
WriteRegister(LCR,ChannelA,0x03); //8 bit,no parity,1 stop bits
WriteRegister(FCR,ChannelA,0x06); //reset FIFO
WriteRegister(FCR,ChannelA,0x00); //disable FIFO
WriteRegister(IER,ChannelA,0x00); //enable RX/TX Interrupt
//*****ChannelB
//set the Baudrate
WriteRegister(LCR,ChannelB,0x80);//bit7 enable
WriteRegister(DLL,ChannelB,SC16_BAUD_4800_DLL);//9600bps
WriteRegister(DLH,ChannelB,SC16_BAUD_4800_DLH);
WriteRegister(LCR,ChannelB,0x03); //8 bit,no parity,1 stop bits
WriteRegister(FCR,ChannelB,0x06); //reset FIFO
WriteRegister(FCR,ChannelB,0x00); //disable FIFO
WriteRegister(IER,ChannelB,0x00); //enable RX/TX Interrupt
}
/****************************************************************************
* 名称:IRQ_Eint3_COM34()
* 功能:外部中断EINT3服务函数,SC16IS75X中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_Eint3_COM34(void)
{
uchar temp,i;
//ChannelA***************************************************************
//ReadRegister(LSR,ChannelA,&temp); //
ReadRegister(IIR,ChannelA,&temp); //
if(!(temp&0X01))
{
switch(temp&0X3F)
{
case 0x06 ://接收器线状态错误
break;
case 0x0c ://接收器超时中断
ReadRegister(RHR,ChannelA,&temp); // 读中断标志
WriteRegister(FCR,ChannelA, 0X02);//Reset the RX FiFo
break;
case 0x04 ://RHR中断
RecvChannelA();
break;
case 0x02 ://THR中断
if (uartSC16IS752A_tlen!=0) // 未发完
{
//uchar ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
WriteRegister(THR,ChannelA, uartSC16IS752A_tbuf[ uartSC16IS752A_tptr]); //发送数据
uartSC16IS752A_tptr++; // 缓冲区指针加1
uartSC16IS752A_tlen--; // 长度减1
}
else // 发送完
{
//U0IER = 0x01; // 关发送中断
WriteRegister(IER,ChannelA,0X01); // 关发送中断
uartSC16IS752A_tptr = 0; // 复位缓冲区指针
uartSC16IS752A_tddy = 2; // 置结束发送延时2mS
}
/*
//test
WriteRegister(IER,ChannelA,0X01); // 关发送中断
for (i=0; (i<15) && (uartSC16IS752A_tlen>0); i++)
{
WriteRegister(THR,ChannelA, uartSC16IS752A_tbuf[ uartSC16IS752A_tptr]); //发送数据
uartSC16IS752A_tptr++; // 缓冲区指针加1
uartSC16IS752A_tlen--; // 长度减1
}
uartSC16IS752A_tptr = 0; // 复位缓冲区指针
uartSC16IS752A_tddy = 2; // 置结束发送延时2mS
*/
break;
case 0x00 ://Modem中断
break;
case 0x30 ://输入脚状态变化
break;
case 0x10 ://接收的Xoff信号/特殊字符
break;
case 0x20 ://CTS\RTS 状态变化
break;
default :break;
}
}
//ChannelB***************************************************************
//ReadRegister(LSR,ChannelB,&temp); //
ReadRegister(IIR,ChannelB,&temp); //
if(!(temp&0X01))
{
switch(temp&0X3F)
{
case 0x06 ://接收器线状态错误
break;
case 0x0c ://接收器超时中断
ReadRegister(RHR,ChannelB,&temp); // 读中断标志
WriteRegister(FCR,ChannelB, 0X02);//Reset the RX FiFo
break;
case 0x04 ://RHR中断
RecvChannelB();
break;
case 0x02 ://THR中断
/*
if (uartSC16IS752B_tlen!=0) // 未发完
{
WriteRegister(THR,ChannelB, uartSC16IS752B_tbuf[ uartSC16IS752B_tptr]); //发送数据
uartSC16IS752B_tptr++; // 缓冲区指针加1
uartSC16IS752B_tlen--; // 长度减1
}
else // 发送完
{
//U0IER = 0x01; // 关发送中断
WriteRegister(IER,ChannelB,0X01); // 关发送中断
uartSC16IS752B_tptr = 0; // 复位缓冲区指针
uartSC16IS752B_tddy = 2; // 置结束发送延时2mS
}*/
//test
WriteRegister(IER,ChannelB,0X01); // 关发送中断
for (i=0; (i<15) && (uartSC16IS752B_tlen>0); i++)
{
WriteRegister(THR,ChannelB, uartSC16IS752B_tbuf[ uartSC16IS752B_tptr]); //发送数据
uartSC16IS752B_tptr++; // 缓冲区指针加1
uartSC16IS752B_tlen--; // 长度减1
}
uartSC16IS752B_tptr = 0; // 复位缓冲区指针
uartSC16IS752B_tddy = 2; // 置结束发送延时2mS
break;
case 0x00 ://Modem中断
break;
case 0x30 ://输入脚状态变化
break;
case 0x10 ://接收的Xoff信号/特殊字符
break;
case 0x20 ://CTS\RTS 状态变化
break;
default :break;
}
}
EXTINT = 0x08; // 清除EINT1中断标志
VICVectAddr = 0; // 向量中断结束
}
/****************************************************************************
* 名称:RecvChannelA()
* 功能:外部中断EINT3。
* 入口参数:无
* 1.
****************************************************************************/
void RecvChannelA(void)
{
uchar ch;
// uchar i;
// uchar getval[12];
ReadRegister(RHR,ChannelA,&ch); //读取数据
if (uartSC16IS752A_over==0) // 超时Xms
{
uartSC16IS752A_head = 0; // 重新开始接收数据
uartSC16IS752A_wptr = uartSC16IS752A_sptr; // 接收缓冲区写指针返回
uartSC16IS752A_cksm = 0; // 复位校验和
uartSC16IS752A_aval = 1; // 当前帧有效
}
if (uartSC16IS752A_aval==1) // 数据有效
{
uartSC16IS752A_cksm += ch; // 计算校验和
uartSC16IS752A_rbuf[uartSC16IS752A_wptr] = ch; // 保存数据
if (++uartSC16IS752A_wptr==uartSC16IS752A_rbuf_size) uartSC16IS752A_wptr = 0; // 循环缓冲区写指针加1
if (uartSC16IS752A_wptr==uartSC16IS752A_rptr) uartSC16IS752A_aval = 0; // 数据覆盖, 当前帧无效
}
uartSC16IS752A_over = 100; // 置超时时间初值: 50*1mS = 50mS
uartSC16IS752A_head++; // 通讯格式计数加1
switch (uartSC16IS752A_head)
{
//01——0XF5
case 0x01: // 数据帧第1字节
{
if (ch!=frame_hed1) // 第1字节不为0xF5则丢弃
{
uartSC16IS752A_head = 0; // 重新开始接收数据
uartSC16IS752A_wptr = uartSC16IS752A_sptr; // 接收缓冲区写指针返回
uartSC16IS752A_cksm = 0; // 复位校验和
uartSC16IS752A_aval = 1; // 当前帧有效
}
break; // 退出case
}
//02——0X89
case 0x02: // 数据帧第2字节
{
if (ch!=frame_hed2) // 第2字节不为0x89则丢弃
{
uartSC16IS752A_head = 0; // 重新开始接收数据
uartSC16IS752A_wptr = uartSC16IS752A_sptr; // 接收缓冲区写指针返回
uartSC16IS752A_cksm = 0; // 复位校验和
uartSC16IS752A_aval = 1; // 当前帧有效
}
if (ch==frame_hed1) // 该字节为数据帧第1字节
{
uartSC16IS752A_cksm += ch; // 计算校验和
uartSC16IS752A_rbuf[uartSC16IS752A_wptr] = ch; // 保存数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -