/****************************************************************************
* 文件名:DATARET.C
* 功能:使用串口UART0接收上位机发送的数据,当接收到8个连续数据后,将接收计数值加一后输
* 出LED1--LED8显示,并将数据原封不动地发送回上位机。
* 说明:将跳线器JP8短接。
* 通讯波特率115200,8位数据位,1位停止位,无奇偶校验。
****************************************************************************/
#include "config.h"
#include "I2CInt.h"
#define UART_BPS 4800 /* 定义通讯波特率 */
#define CAT24WC02 0xA0 /* 定义器件地址 */
/* 定义串口模式设置数据结构 */
typedef struct UartMode
{ uint8 datab; // 字长度,5/6/7/8
uint8 stopb; // 停止位,1/2
uint8 parity; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
} UARTMODE;
uint8 rcv_buf[39]; // UART0数据接收缓冲区
uint8 countdata;
volatile uint8 rcv_new; // 接收新数据标志
// EEPROM 0X00--0X0F
uint8 Singel_A_CheckTime;
uint8 Singel_A_Frequency;
uint8 Singel_A_NoFireDelay;
uint8 Single_A_Q;
uint8 Double_A_CheckTime;
uint8 Double_A_Frequency;
uint8 Double_A_NoFireDelay;
uint8 Double_A_Q;
// EEPROM 0X10--0X1D
uint8 Double_B_CheckTime;
uint8 Double_B_Frequency;
uint8 Double_B_NoFireDelay;
uint8 Double_B_Q;
uint8 Flag_Single_Double;
uint8 Flag_A_B;
uint8 Flag_Enable_Bypass;
// EEPROM 0X20--0X27
uint16 A_pps;
uint16 B_pps;
extern SendByte(uint8);
extern UART1_SendByte(uint8);
extern ADC(void);
extern DAC(void);
extern DataRet(void);
extern Relay(void);
#define PA0 0X00010000 // P2.16
#define PA1 0x00020000 // P2.17
#define PA2 0x00040000 // P2.18
#define PA3 0x00080000 // P2.19
#define PA4 0x00100000 // P2.20
#define PA5 0x00200000 // P2.21
#define PA6 0x00400000 // P2.22
#define PA7 0x00800000 // P2.23
#define PB0 0X01000000 // P2.24
#define PB1 0X02000000 // P2.25
#define PB4 0X10000000 // P2.28
#define PB5 0X28000000 // P2.29
#define PB6 0X40000000 // P2.30
#define PB7 0X80000000 // P2.31
#define P2_DIR 0XFBFF0000
#define PB2 0X20000000 // P0.29
#define PB3 0X40000000 // P0.30
#define P0_DIR 0X60000000
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<50; i++);
}
/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。
* 入口参数:baud 波特率
* set 模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初化成功,为0表除参数出错
****************************************************************************/
uint8 UART0_Ini(uint32 baud, UARTMODE set)
{ uint32 bak;
// 参数过滤
if( (0==baud)||(baud>115200) ) return(0);
if( (set.datab<5)||(set.datab>8) ) return(0);
if( (0==set.stopb)||(set.stopb>2) ) return(0);
if( set.parity>4 ) return(0);
// 设置串口波特率
U0LCR = 0x80; // DLAB位置1
bak = (Fpclk>>4)/baud;
U0DLM = bak>>8;
U0DLL = bak&0xff;
// 设置串口模式
bak = set.datab-5; // 设置字长度
if(2==set.stopb) bak |= 0x04; // 判断是否为2位停止位
if(0!=set.parity) {set.parity = set.parity-1; bak |= 0x08;}
bak |= set.parity<<4; // 设置奇偶校验
U0LCR = bak;
return(1);
}
/****************************************************************************
* 名称:UART1_Ini()
* 功能:初始化串口1。设置其工作模式及波特率。
* 入口参数:baud 波特率
* set 模式设置(UARTMODE数据结构)
* 出口参数:无
****************************************************************************/
void UART1_Ini(void)
{ uint16 Fdiv;
U1LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U1DLM = Fdiv / 256;
U1DLL = Fdiv % 256;
U1LCR = 0x03;
}
/****************************************************************************
* 名称:Time0Init()
* 功能:定时器0初始化函数
* 出口参数:无
****************************************************************************/
void Time0Init(void)
{ /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz
Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz
*/
T0PR = 99; // 设置定时器0分频为100分频,得110592Hz
T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC
//T0MR0 = 110592; // 比较值(1S定时值)
T0MR0=20000;
T0TCR = 0x03; // 启动并复位T0TC
T0TCR = 0x01;
}
/****************************************************************************
* 名称:IRQ_UART0()
* 功能:串口UART0接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_UART0(void)
{
//uint8 buffer;
if( 0x04==(U0IIR&0x0F) ) rcv_new = 1;// 设置接收到新的数据标志
T0TCR = 0x03; // 启动并复位T0TC
T0TCR = 0x01;
rcv_buf[countdata] = U0RBR;
countdata++;
//UART1_SendByte(0x33);
//UART1_SendByte(rcv_buf[countdata-1]);
//UART1_SendByte(buffer);
VICVectAddr = 0x00; // 中断处理结束
}
/****************************************************************************
* 名称:IRQ_Time0()
* 功能:定时器0中断响应函数
* 出口参数:无
****************************************************************************/
void __irq IRQ_Time0(void)
{
//UART1_SendByte(0x11);
countdata=0;
T0IR = 0x01; // 清除中断标志
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
/****************************************************************************
* 名称:I2C_Init()
* 功能:主模式I2C初始化,包括初始化其中断为向量IRQ中断。
* 入口参数:fi2c 初始化I2C总线速率,最大值为400K
* 出口参数:无
****************************************************************************/
void I2C_Init(uint32 fi2c)
{ if(fi2c>400000) fi2c = 400000;
//PINSEL0 = (PINSEL0&0xFFFFFF0F) | 0x50; // 设置I2C控制口有效
I2SCLH = (Fpclk/fi2c + 1) / 2; // 设置I2C时钟为fi2c
I2SCLL = (Fpclk/fi2c) / 2;
I2CONCLR = 0x2C;
I2CONSET = 0x40; // 使能主I2C
/* 设置I2C中断允许 */
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl3 = 0x29; // I2C通道分配到IRQ slot 0,即优先级最高
VICVectAddr3 = (int)IRQ_I2C; // 设置I2C中断向量地址
VICIntEnable = 0x0270; // 使能I2C中断
}
void CheckI2CData()
{
uint8 data_buf[38];
uint8 i;
// 测试程序
for(i=0;i<38;i++) data_buf[i]=0x11+i;
ISendStr(CAT24WC02, 0x00, data_buf, 16); // 在0x00地址处写入16字节数据
DelayNS(1);
ISendStr(CAT24WC02, 0x10, data_buf+16, 14); // 在0x00地址处写入14字节数据
DelayNS(1);
ISendStr(CAT24WC02, 0x20, data_buf+30, 8); // 在0x00地址处写入8字节数据
DelayNS(1);
for(i=0; i<38; i++) data_buf[i] = 0;
IRcvStr(CAT24WC02, 0x00, data_buf, 16); // 在0x00地址处读出10字节数据
DelayNS(1);
IRcvStr(CAT24WC02, 0x10, data_buf+16, 14); // 在0x00地址处读出10字节数据
DelayNS(1);
IRcvStr(CAT24WC02, 0x20, data_buf+30, 8); // 在0x00地址处读出10字节数据
DelayNS(1);
for(i=0;i<38;i++) SendByte(data_buf[i]);
UART1_SendByte(0xaa);
}