📄 rm-idd-2214.c
字号:
/****************************************************************************
* 文件名: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);
}
/****************************************************************************
* 名称:main()
* 功能:初始化串口,并等待接收到串口数据。
* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
****************************************************************************/
int main(void)
{
UARTMODE uart0_set;
//uint8 i;
uint8 test;
//uint8 data_buf[10];
PINSEL0 = 0x00050055; // 设置I/O连接到UART0、UART1
PINSEL1 = 0x00000000;
PINSEL2 = 0x00000914;
rcv_new = 0;
uart0_set.datab = 8; // 8位数据位
uart0_set.stopb = 1; // 1位停止位
uart0_set.parity = 0; // 无奇偶校验
UART0_Ini(UART_BPS, uart0_set); // 初始化串口模式
//UART0_Ini();
UART1_Ini();
U0FCR = 0x01; // 使能FIFO,并设置触发点为8字节
U0IER = 0x01; // 允许RBR中断,即接收中断
/* 设置I2C中断允许 */
/* 设置中断允许 */
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl2 = 0x26; // UART0中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr2 = (int)IRQ_UART0; // 设置UART0向量地址
VICIntEnable = 0x00000270; // 使能UART0中断
/* 设置定时器1中断IRQ */
/* 设置定时器0中断IRQ */
VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断
VICVectCntl0 = 0x24; // 定时器0中断通道分配最高优先级(向量控制器0)
VICVectAddr0 = (uint32)IRQ_Time0; // 设置中断服务程序地址向量
VICIntEnable = 0x00000270; // 使能定时器0中断
IO0DIR = P0_DIR;
IO2DIR = P2_DIR;
// PA、PB初始化
IO2SET=PB0; //
IO2CLR=PB1;
IO0SET=PB2;
IO0CLR=PB3; //
// IO2CLR=PB4;
// IO2SET=PB5;
// IO2SET=PB7;
// IO2CLR=PA0;
IO2SET=PA0;
IO2CLR=PA1;
IO2CLR=PA2;
// IO2SET=PA4;
// IO2CLR=PA5;
// IO2SET=PA7;
countdata=0;
test=0;
Time0Init();
I2C_Init(100000); // I2C初始化
while(1)
{
/* //UART1_SendByte(0xaa);
//CheckI2CData();
IO2SET=PB1;
DelayNS(10);
IO2CLR=PB1;
DelayNS(10);*/
}
/*
while(1)
{
// i2c
for(i=0; i<10; i++) data_buf[i] = i+'0';
ISendStr(CAT24WC02, 0x00, data_buf, 10); // 在0x00地址处写入10字节数据
DelayNS(10);
for(i=0; i<10; i++) data_buf[i] = 0;
IRcvStr(CAT24WC02, 0x00, data_buf, 10); // 在0x00地址处读出10字节数据
for(i=0;i<10;i++) UART1_SendByte(data_buf[i]);
DelayNS(100);
}
*/
/*
while(1)
{
// A/D转换程序
ADC();
// 继电器和发光管处理程序
Relay();
// A/D转换程序
DAC();
// 串口处理程序
if( (1==rcv_new) && (0==countdata) )
{
DataRet();
rcv_new=0;
}
}
*/
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -