359 lines
7.7 KiB
C
359 lines
7.7 KiB
C
#include "H/Function_Init.H"
|
||
|
||
//选择三合一模块:
|
||
#define USCI2 2
|
||
#define USCI3 3
|
||
#define USCI4 4
|
||
#define USCI5 5
|
||
|
||
//选择三合一模式:
|
||
#define UartX 0
|
||
#define TWIX 1
|
||
#define SPIX 2
|
||
|
||
#define USCIX_Select USCI3
|
||
#define USCIX_Mode 2
|
||
|
||
void UARTX_Init(uint Freq, unsigned long int baud);
|
||
void TWIX_Init(void);
|
||
void SPIX_Init(void);
|
||
|
||
bit UartXSendFlag = 0; //UartX发送中断标志位
|
||
bit UartXReceiveFlag = 0; //UartX接收中断标志位
|
||
bit SPIXFlag = 0; //SPIX数据传输完成标志位
|
||
bit TWIXFlag = 0; //TWIX中断标志位
|
||
|
||
/*****************************************************
|
||
*函数名称:void USCIX_Test(void)
|
||
*函数功能:USCIX测试
|
||
*入口参数:void
|
||
*出口参数:void
|
||
*****************************************************/
|
||
void USCIX_Test(void)
|
||
{
|
||
USXINX = USCIX_Select; //USCIX寄存器指向对应的USCI
|
||
|
||
//判断三合一模式
|
||
#if (USCIX_Mode == UartX)
|
||
{
|
||
UARTX_Init(32, 9600); //初始化串口,输入主频和波特兰
|
||
while(1)
|
||
{
|
||
USXCON3 = 0xAA; //发送0xAA
|
||
while(!UartXSendFlag); //等待发送完成标志位置起
|
||
UartXSendFlag = 0; //清除发送标志位
|
||
}
|
||
}
|
||
#elif (USCIX_Mode == TWIX)
|
||
{
|
||
TWIX_Init();
|
||
while(1)
|
||
{
|
||
USXCON1 |= 0x20; //产生起始条件
|
||
while(!TWIXFlag);
|
||
TWIXFlag = 0;
|
||
USXCON3 = 0x10; //发送地址及写命令
|
||
while(!TWIXFlag);
|
||
TWIXFlag = 0;
|
||
USXCON3 = 0x55;
|
||
while(!TWIXFlag);
|
||
TWIXFlag = 0;
|
||
Delay(100);
|
||
USXCON1 |= 0x10; //发送结束信号
|
||
Delay(100);
|
||
}
|
||
}
|
||
#elif (USCIX_Mode == SPIX)
|
||
{
|
||
SPIX_Init();
|
||
while(1)
|
||
{
|
||
USXCON2 = 0xAA;
|
||
while(!SPIXFlag);
|
||
SPIXFlag = 0;
|
||
Delay(1000);
|
||
}
|
||
}
|
||
#endif
|
||
|
||
}
|
||
|
||
/*****************************************************
|
||
*函数名称:void UARTX_Init(uint Freq,unsigned long int baud)
|
||
*函数功能:UartX中断初始化
|
||
*入口参数:Freq-主频,baud-波特率
|
||
*出口参数:void
|
||
*****************************************************/
|
||
void UARTX_Init(uint Freq, unsigned long int baud)
|
||
{
|
||
TMCON |= 0xC0; //串行接口USCIX选择Uart通信
|
||
#if (USCIX_Select == USCI2)
|
||
P4CON &= ~0x30;
|
||
P4PH |= 0x30;
|
||
IE2 |= 0x02; //开启中断
|
||
#elif (USCIX_Select == USCI3)
|
||
P2CON &= ~0xC0;
|
||
P2PH |= 0xC0;
|
||
IE2 |= 0x04; //开启中断
|
||
#elif (USCIX_Select == USCI4)
|
||
P4CON &= ~0xC0;
|
||
P4PH |= 0xC0;
|
||
IE2 |= 0x08; //开启中断
|
||
#elif (USCIX_Select == USCI5)
|
||
P0CON &= ~0x0C;
|
||
P0PH |= 0x0C;
|
||
IE2 |= 0x10; //开启中断
|
||
#endif
|
||
|
||
USXCON0 = 0x50; //设置通信方式为模式一,允许接收
|
||
USXCON1 = Freq * 1000000 / baud; //波特率低位控制
|
||
USXCON2 = (Freq * 1000000 / baud) >> 8; //波特率高位控制
|
||
|
||
EA = 1;
|
||
}
|
||
|
||
/*****************************************************
|
||
*函数名称:void TWIX_Init(void)
|
||
*函数功能:TWIX初始化
|
||
*入口参数:void
|
||
*出口参数:void
|
||
*****************************************************/
|
||
void TWIX_Init(void)
|
||
{
|
||
TMCON |= 0x80; //串行接口USCIX选择TWI通信
|
||
#if (USCIX_Select == USCI2)
|
||
P4CON &= ~0x18;
|
||
P4PH |= 0x18;
|
||
IE2 |= 0x02; //开启中断
|
||
#elif (USCIX_Select == USCI3)
|
||
P2CON &= ~0x60;
|
||
P2PH |= 0x60;
|
||
IE2 |= 0x04; //开启中断
|
||
#elif (USCIX_Select == USCI4)
|
||
P5CON &= ~0x20;
|
||
P5PH |= 0x20;
|
||
P4CON &= ~0x70;
|
||
P4PH |= 0x70;
|
||
IE2 |= 0x08; //开启中断
|
||
#elif (USCIX_Select == USCI5)
|
||
P0CON &= ~0x06;
|
||
P0PH |= 0x06;
|
||
IE2 |= 0x10; //开启中断
|
||
#endif
|
||
TMCON |= 0x80; //选择TWIX模式
|
||
USXCON0 = 0x80; //主模式, 使能应答标志位
|
||
USXCON1 = 0x05; //---- xxxx x为时钟速率
|
||
IE2 |= 1 << (USCIX_Select - 1); //开启中断
|
||
EA = 1;
|
||
}
|
||
|
||
/*****************************************************
|
||
*函数名称:void SPIX_Init(void)
|
||
*函数功能:SPIX初始化
|
||
*入口参数:void
|
||
*出口参数:void
|
||
*****************************************************/
|
||
void SPIX_Init(void)
|
||
{
|
||
TMCON |= 0x40; //串行接口USCIX选择SPI通信
|
||
#if (USCIX_Select == USCI2)
|
||
P4CON &= ~0x38;
|
||
P4PH |= 0x38;
|
||
IE2 |= 0x02; //开启中断
|
||
#elif (USCIX_Select == USCI3)
|
||
P2CON &= ~0xE0;
|
||
P2PH |= 0xE0;
|
||
IE2 |= 0x04; //开启中断
|
||
#elif (USCIX_Select == USCI4)
|
||
P5CON &= ~0x20;
|
||
P5PH |= 0x20;
|
||
P4CON &= ~0xC0;
|
||
P4PH |= 0xC0;
|
||
IE2 |= 0x08; //开启中断
|
||
#elif (USCIX_Select == USCI5)
|
||
P0CON &= ~0x0E;
|
||
P0PH |= 0x0E;
|
||
IE2 |= 0x10; //开启中断
|
||
#endif
|
||
TMCON |= 0X40; //选择SPIX模式
|
||
USXCON0 = 0x3F; //设置SPIX为主设备,SCK空闲时间为高电平,SCK周期第二沿采集数据,时钟速率为Fsys/128
|
||
USXCON1 = 0x01; //MSB优先发送,8位传输,允许发送中断
|
||
USXCON0 |= 0x80; //开启SPIX
|
||
IE2 |= 1 << (USCIX_Select - 1); //开启中断
|
||
EA = 1;
|
||
}
|
||
|
||
#if (USCIX_Select == USCI2)
|
||
/*****************************************************
|
||
*函数名称:void TWI2/SPI2/UART2_Int() interrupt 7
|
||
*函数功能:USCI2中断函数
|
||
*入口参数:void
|
||
*出口参数:void
|
||
*****************************************************/
|
||
#if (USCIX_Mode == UartX)
|
||
void UART2_Int() interrupt 16 //UartX中断函数
|
||
{
|
||
if(USXCON0 & 0x02) //发送标志位判断
|
||
{
|
||
USXCON0 &= 0xFE;
|
||
UartXSendFlag = 1;
|
||
}
|
||
if((USXCON0 & 0x01)) //接收标志位判断
|
||
{
|
||
USXCON0 &= 0xFD;
|
||
UartXReceiveFlag = 1;
|
||
}
|
||
}
|
||
#elif (USCIX_Mode == TWIX)
|
||
void TWI2_Int() interrupt 16 //TWIX中断函数
|
||
{
|
||
if(USXCON0 & 0x40)
|
||
{
|
||
USXCON0 &= 0xbf; //中断清零
|
||
TWIXFlag = 1;
|
||
}
|
||
}
|
||
#elif (USCIX_Mode == SPIX)
|
||
void SPI2Int(void) interrupt 16 //SPIX中断函数
|
||
{
|
||
if(USXCON1 & 0X08) //发送缓存器空标志判断
|
||
{
|
||
USXCON1 &= ~0X08;
|
||
}
|
||
if(USXCON1 & 0X80) //数据传输标志位判断
|
||
{
|
||
USXCON1 &= ~0X80;
|
||
SPIXFlag = 1;
|
||
}
|
||
}
|
||
#endif
|
||
#elif (USCIX_Select == USCI3)
|
||
/*****************************************************
|
||
*函数名称:void TWI3/SPI3/UART3_Int() interrupt 7
|
||
*函数功能:USCI2中断函数
|
||
*入口参数:void
|
||
*出口参数:void
|
||
*****************************************************/
|
||
#if (USCIX_Mode == UartX)
|
||
void UART3_Int() interrupt 17 //UartX中断函数
|
||
{
|
||
if(USXCON0 & 0x02) //发送标志位判断
|
||
{
|
||
USXCON0 &= 0xFE;
|
||
UartXSendFlag = 1;
|
||
}
|
||
if((USXCON0 & 0x01)) //接收标志位判断
|
||
{
|
||
USXCON0 &= 0xFD;
|
||
UartXReceiveFlag = 1;
|
||
}
|
||
}
|
||
#elif (USCIX_Mode == TWIX)
|
||
void TWI3_Int() interrupt 17 //TWIX中断函数
|
||
{
|
||
if(USXCON0 & 0x40)
|
||
{
|
||
USXCON0 &= 0xbf; //中断清零
|
||
TWIXFlag = 1;
|
||
}
|
||
}
|
||
#elif (USCIX_Mode == SPIX)
|
||
void SPI3_Int(void) interrupt 17 //SPIX中断函数
|
||
{
|
||
if(USXCON1 & 0X08) //发送缓存器空标志判断
|
||
{
|
||
USXCON1 &= ~0X08;
|
||
}
|
||
if(USXCON1 & 0X80) //数据传输标志位判断
|
||
{
|
||
USXCON1 &= ~0X80;
|
||
SPIXFlag = 1;
|
||
}
|
||
}
|
||
#endif
|
||
#elif (USCIX_Select == USCI4)
|
||
/*****************************************************
|
||
*函数名称:void TWI4/SPI4/UART4_Int() interrupt 7
|
||
*函数功能:USCI2中断函数
|
||
*入口参数:void
|
||
*出口参数:void
|
||
*****************************************************/
|
||
#if (USCIX_Mode == UartX)
|
||
void UART4_Int() interrupt 18 //UartX中断函数
|
||
{
|
||
if(USXCON0 & 0x02) //发送标志位判断
|
||
{
|
||
USXCON0 &= 0xFE;
|
||
UartXSendFlag = 1;
|
||
}
|
||
if((USXCON0 & 0x01)) //接收标志位判断
|
||
{
|
||
USXCON0 &= 0xFD;
|
||
UartXReceiveFlag = 1;
|
||
}
|
||
}
|
||
#elif (USCIX_Mode == TWIX)
|
||
void TWI4_Int() interrupt 18 //TWIX中断函数
|
||
{
|
||
if(USXCON0 & 0x40)
|
||
{
|
||
USXCON0 &= 0xbf; //中断清零
|
||
TWIXFlag = 1;
|
||
}
|
||
}
|
||
#elif (USCIX_Mode == SPIX)
|
||
void SPI4_Int(void) interrupt 18 //SPIX中断函数
|
||
{
|
||
if(USXCON1 & 0X08) //发送缓存器空标志判断
|
||
{
|
||
USXCON1 &= ~0X08;
|
||
}
|
||
if(USXCON1 & 0X80) //数据传输标志位判断
|
||
{
|
||
USXCON1 &= ~0X80;
|
||
SPIXFlag = 1;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
#elif (USCIX_Select == USCI5)
|
||
#if (USCIX_Mode == UartX)
|
||
void UART5_Int() interrupt 19 //UartX中断函数
|
||
{
|
||
if(USXCON0 & 0x02) //发送标志位判断
|
||
{
|
||
USXCON0 &= 0xFE;
|
||
UartXSendFlag = 1;
|
||
}
|
||
if((USXCON0 & 0x01)) //接收标志位判断
|
||
{
|
||
USXCON0 &= 0xFD;
|
||
UartXReceiveFlag = 1;
|
||
}
|
||
}
|
||
#elif (USCIX_Mode == TWIX)
|
||
void TWI5_Int() interrupt 19 //TWIX中断函数
|
||
{
|
||
if(USXCON0 & 0x40)
|
||
{
|
||
USXCON0 &= 0xbf; //中断清零
|
||
TWIXFlag = 1;
|
||
}
|
||
}
|
||
#elif (USCIX_Mode == SPIX)
|
||
void SPI5_Int(void) interrupt 19 //SPIX中断函数
|
||
{
|
||
if(USXCON1 & 0X08) //发送缓存器空标志判断
|
||
{
|
||
USXCON1 &= ~0X08;
|
||
}
|
||
if(USXCON1 & 0X80) //数据传输标志位判断
|
||
{
|
||
USXCON1 &= ~0X80;
|
||
SPIXFlag = 1;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
#endif
|