?? 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 + -