📄 main.c
字号:
VICVectAddr = 0; // Acknowledge Interrupt
}
/*************************串口0发送单个字节******************************************
名称:串口0发送单个字节
作者: 邱志城
日期:2007.09.17
输入参数:要发送的字节
输出参数:无
功能:串口0发送单个字节
******************************************************************************/
void UART0_SendByte (unsigned char m)
{
U0THR = m; // 发送数据
while((U0LSR&0x40)==0 ); // 等待数据发送完毕
}
/*************************串口0发送字符串******************************************
名称:串口0发送字符串
作者: 邱志城
日期:2007.09.17
输入参数:要发送的字节数组,*buf, 及数组的长度Len
输出参数:无
功能:串口0发送字符串
******************************************************************************/
void UART0_SendString(unsigned char *buf, unsigned short Len)
{
unsigned short i;
IO0SET = SP485_EN0;
for(i = 0; i < Len; i++)
{
UART0_SendByte(buf[i]);
}
IO0CLR = SP485_EN0;
}
/*************************测试串口0发送******************************************
名称:测试串口0发送
作者: 邱志城
日期:2007.09.17
输入参数:无
输出参数:无
功能:测试串口0发送
******************************************************************************/
void UART0_SendTest(void)
{
unsigned char MESSAGE[6];
MESSAGE[0] = 0xaa;
MESSAGE[1] = 0xaa;
MESSAGE[2] = 0xaa;
MESSAGE[3] = 0xaa;
MESSAGE[4] = 0xaa;
MESSAGE[5] = 0xaa;
UART0_SendString(MESSAGE, 6); // 发送数据
}
/*************************串口0数据处理******************************************
名称:串口0初始化
作者: 邱志城
日期:2007.09.17
输入参数:无
输出参数:无
功能:串口0初始化。包括波特,中断使能,FIFO中断设置
******************************************************************************/
void UART1_Deal(void)
{
UART0_SendString(UART1_Rcvbuf, UART1_RcvLen);
UART1_SendString(UART1_Rcvbuf, UART1_RcvLen);
UART1_RcvLen = 0;
}
/*************************串口1初始化******************************************
作者: 邱志城
日期:2007.09.17
输入参数:串口工作的波特率
输出参数:无
功能:串口1初始化。包括波特,中断使能,FIFO中断设置
******************************************************************************/
void UART1_Init(void)
{
unsigned int Fdiv;
U1LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv =(Fpclk/16)/BAUD_RATE;
U1DLL = Fdiv%256;
U1DLM = Fdiv/256;
U1LCR = 0x03;
U1IER = 0X01; //设置串口0的中断使能
U1FCR = 0x01; //使能FIFO,串口接收到4个字节才产生中断
}
/*************************串口1接收中断*****************************************
名称:串口1接收中断
作者: 邱志城
日期:2007.09.17
输入参数:无
输出参数:串口1所接收的数据
功能:串口1中断接收, 接收上位机的电总协议
******************************************************************************/
/*
void __irq UART1_IRQ(void)
{
unsigned char Rcv_data, m;
if((U1IIR & 0x0f) && 0x04) //因为设置FIFO的字节长度为4
{
for(m = 0; m < 4; m++)
{
Rcv_data = U1RBR;
TIMER0_count[1] = 0; //清除计数器
TIMER0_Flag[1] = TRUE;
UART1_Rcv_buf[UART1_RcvCount] = Rcv_data;
UART1_RcvCount++;
}
// UART1_LED();
}
VICVectAddr = 0; // Acknowledge Interrupt
}
*/
void __irq UART1_IRQ(void)
{
unsigned char IIRValue, LSRValue, UART1Status;
unsigned char Rcv_data;
IIRValue = U1IIR; //读取中断标识寄存器
Rcv_data = U1RBR; // Dummy read on RX to clear
TIMER0_count[1] = 0; //清除计数器
TIMER0_Flag[1] = TRUE;
IIRValue >>= 1; // skip pending bit in IIR
IIRValue &= 0x07; // check bit 1~3, interrupt identification
if (IIRValue == IIR_RLS ) // Receive Line Status
{
LSRValue = U1LSR; //读取线状态寄存器
if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) ) //判断线状态标志 Receive Line Status
{
UART1Status = LSRValue;
VICVectAddr = 0; // Acknowledge Interrupt
return;
}
if (LSRValue & LSR_RDR ) // Receive Data Ready
{
UART1_RcvTempbuf[UART1_RcvCount] = Rcv_data;
UART1_RcvCount++;
}
}
else if (IIRValue == IIR_RDA ) // Receive Data Available
{
// Receive Data Available
UART1_RcvTempbuf[UART1_RcvCount] = Rcv_data;
UART1_RcvCount++;
}
else if (IIRValue == IIR_CTI ) // Character timeout indicator
{
// Character Time-out indicator
UART1Status |= 0x100; // Bit 9 as the CTI error 接收超时置位
}
UART1_LED();
VICVectAddr = 0; // Acknowledge Interrupt
}
/*************************串口1发送单个字节******************************************
名称:串口1发送单个字节
作者: 邱志城
日期:2007.09.17
输入参数:要发送的字节
输出参数:无
功能:串口1发送单个字节
******************************************************************************/
void UART1_SendByte(unsigned char m)
{
U1THR = m; // 发送数据
while((U1LSR&0x40)==0 ); // 等待数据发送完毕
}
/*************************串口1发送字符串******************************************
名称:串口1发送字符串
作者: 邱志城
日期:2007.09.17
输入参数:要发送的字节数组,*buf, 及数组的长度Len
输出参数:无
功能:串口1发送字符串
******************************************************************************/
void UART1_SendString(unsigned char *buf, unsigned short Len)
{
unsigned short i;
IO0SET = SP485_EN1;
for(i = 0; i < Len; i++)
{
UART1_SendByte(buf[i]);
}
IO0CLR = SP485_EN1;
}
/*************************串口1发送测试数据******************************************
名称:串口1发送测试数据
作者: 邱志城
日期:2007.09.17
输入参数:要发送的字节数组,*buf, 及数组的长度Len
输出参数:无
功能:串口1发送测试数据
******************************************************************************/
void UART1_SendTest(void)
{
unsigned char MESSAGE[6];
MESSAGE[0] = 0xaa;
MESSAGE[1] = 0xaa;
MESSAGE[2] = 0xaa;
MESSAGE[3] = 0xaa;
MESSAGE[4] = 0xaa;
MESSAGE[5] = 0xaa;
UART1_SendString(MESSAGE, 6);
}
/****************************************************************************
名称:SPI_Init()
作者: 邱志城
日期:2007.09.17
输入参数:要发送的字节数组,*buf, 及数组的长度Len
输出参数:无
功能:看门狗初始化
****************************************************************************/
void Spi_Init(void)
{
SPI_SPCCR = 0x52; // 设置SPI时钟分频
SPI_SPCR = 0xa0; //SPI中断使能有并行,SPI数据传输高位在先,主模式,时钟极性,高电平有效
}
/****************************************************************************
* 名称:SpiSendByte(unsigned char Sdata)()
* 功能:初始化SPI接口,设置为主机。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SpiSendByte(unsigned char Sdata)
{
SPI_SPDR = Sdata; //发送数据
while((SPI_SPSR & 0X80) == 0); //等待SPIF置位,即等待数据发送完毕
}
/****************************************************************************
* 名称:SpiSendByte(unsigned char Sdata)()
* 功能:初始化SPI接口,设置为主机。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SpiSendString(unsigned char Scmd, unsigned int Saddr, unsigned char *Sdata, unsigned short SLen)
{
unsigned short m, i;
unsigned char tempAddr[4];
tempAddr[0] = Saddr & 0x000000ff;
tempAddr[1] = (Saddr >> 8) & 0x0000ff;
tempAddr[1] = (Saddr >> 16) & 0x00ff;
tempAddr[3] = (Saddr >> 24);
IO0CLR = CE; //片选
SpiSendByte(Scmd);
for(i = 0; i < 4; i++)
{
SpiSendByte(tempAddr[i]);
}
for ( i = 0; i < SPI_DelayNum; i++ ); /* delay minimum 250ns */
for(m = 0; m < SLen; m++)
{
SpiSendByte(*Sdata);
Sdata++;
}
IO0SET = CE;}
unsigned char SpiReceiveByte(void)
{
unsigned char Sdata;
while((SPI_SPSR & 0X80) == 0x80);
Sdata = SPI_SPDR;
return (Sdata );
}
void SpiReceive(unsigned char Scmd, unsigned short Saddr, unsigned char *Sdata, unsigned short SLen)
{
unsigned short m, i;
unsigned char tempAddr[4];
tempAddr[0] = Saddr & 0x000000ff;
tempAddr[1] = (Saddr >> 8) & 0x0000ff;
tempAddr[1] = (Saddr >> 16) & 0x00ff;
tempAddr[3] = (Saddr >> 24);
IO0CLR = CE; //片选
SpiSendByte(Scmd);
for(i = 0; i < 4; i++)
{
SpiSendByte(tempAddr[i]);
}
for ( i = 0; i < SPI_DelayNum; i++ ); //也许延进要放在前面 delay minimum 250ns */
for(m = 0; m < SLen; m++)
{
*Sdata = SpiReceiveByte();
Sdata++;
}
IO0SET = CE;
}
/*************************看门狗初始化******************************************
名称:WDTINIT()
作者: 邱志城
日期:2007.09.17
输入参数:要发送的字节数组,*buf, 及数组的长度Len
输出参数:无
功能:看门狗初始化
******************************************************************************/
void WDT_Init(unsigned int m)
{
WDTC = (Fpclk*4)/m;//Fpclk是11059200Hz,
WDMOD = 0x03;
WDFEED = 0xAA;
WDFEED = 0x55;
}
/*************************看门狗初始化******************************************
名称:FEEDWDT()
作者: 邱志城
日期:2007.09.17
输入参数:无
输出参数:无
功能:看门狗喂狗
******************************************************************************/
void WDTFEED(void)
{
WDFEED = 0xAA;
WDFEED = 0x55;
}
/****************************************************************************
**主函数:读取实时时钟的值,并从串口发送出去。
****************************************************************************/
int main(void)
{
SYSTEM_Init(); //系统初始化
PLL_Init(); //IC工作时钟初始化
UART0_Init(); //串口0初始化
UART1_Init(); //UART1_BPS = 57600 串口1初始化
TIMER0_Init(); //定时器0初始化
TIMER1_Init(); //定时器1初始化
INTERRUPT_Init(); //中断初始化
UART0_SendTest();
UART1_SendTest(); // 读取时钟值,并向UART0发送
Spi_Init();
// WDT_Init(8);
while (1)
{
if(UART0_RcvOk == TRUE)
{
UART0_RcvOk = FALSE;
UART0_Deal();
}
if(UART1_RcvOk == TRUE)
{
UART1_RcvOk = FALSE;
UART1_Deal();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -