Weight_Bed/USCIX_Init.c

359 lines
7.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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