📄 2_uart_sst.c
字号:
if(uart2_tx.tx_bitcont==0)
uart2_tx.tx_state=TX_STOP_BIT; //8位的数据发送完毕,将状态改为发送停止位
}break ;
case TX_STOP_BIT:
{ //sent stop bit //是发送的停止位状态,发送停止位,
TXD2=1;
uart2_tx.tx_state=TX_STOP_END; //置发送状态置为发送结束标志
}break ;
case TX_STOP_END:
{ //a byte data was sent finished //是发送结束标志,重置为发送起始位状态
uart2_tx.tx_state=TX_START_BIT;
uart2_tx.count++; //发送的数据个数加一
if(uart2_tx.len==uart2_tx.count) //判断是否缓冲区的数据全部发送完?
{
CCAPM2=DISABLED_MODE; //发送的数据长度等于发送的数据个数,禁止PCA的操作
uart2_tx.tx_state=0xff; //置禁止发送
}
}break ;
default : CCAPM2=DISABLED_MODE; break ; //其它状态,统统禁止发送
}
}
//============================= UART2的发送过程====================================
if (CCF3) //是PCA1的捕捉响应标志,说明PCA1管脚上有下降沿或上升沿出现,
{ //第一次是属于外部捕捉的下降沿中断,以后便是软件定时器的采集定时中断(在每位的中间时刻进行采集数据)
CCF3=0; //清接收的PCA1中断标志
switch (uart2_rx.rx_state)
{
case RX_START_EDGE: //是接收的起始边沿
{
temp_ccap = CCAP3H *0x100 + CCAP3L + HALF_SPEEDL; //???为何要多加一个位的低8位时间?--由于高8位进位的问题捕捉当前的时间,再加上半位的时间为何要多加一个位的低8位时间?,
CCAP3H = temp_ccap/0x100 +HALF_SPEEDH ; //重置捕捉的高8位数据,再加半位时间 //就是下一个起始位的中间采集时刻
CCAP3L += HALF_SPEEDL; //实际上,CCAP0L并没有多加一次FULL_SPEEDL,加也只是加在了temp_ccap上重置捕捉的低8位数据,再加半位时间
CCAPM3=TIME_INIT; //置为软件定时器中断方式,计算下一位的采集时间
uart2_rx.rx_state=RX_START_BIT; //置下一个状态为:接收起始位
}break;
case RX_START_BIT: //是接收起始位
{
temp_ccap = CCAP3H *0x100 + CCAP3L + FULL_SPEEDL; //???:为何要多加一个位的低8位时间??--由于高8位进位的问题
CCAP3L += FULL_SPEEDL; //实际上,CCAP0L并没有多加一次FULL_SPEEDL,加也只是加在了temp_ccap上
CCAP3H = temp_ccap/0x100 +FULL_SPEEDH ; //置下一个位的采集时间,就是本次的时间加上一个位的时间
if (RXD2)
{
uart2_rx.rx_state=RX_START_EDGE; //如果RXD2=1,说明不是起始位,起始位应为0
CCAPM3=NEG_CAP_INT; //置为下降沿捕捉中断方式
}
else
{
uart2_rx.rx_state=RX_DATA_BIT; //RXD2=0,为接收的起始位,置下一状态为数据接收
uart2_rx.rx_bitcont=8; //接收8位的数据
}
}break;
case RX_DATA_BIT: //是接收数据位的状态
{
temp_ccap = CCAP3H *0x100 + CCAP3L + FULL_SPEEDL; //???为何要多加一个位的低8位时间?
CCAP3L += FULL_SPEEDL;
CCAP3H = temp_ccap/0x100 +FULL_SPEEDH ; //置下一个位的采集时间
uart2_rx.buff[uart2_rx.count]=uart2_rx.buff[uart2_rx.count]>>1; //接收的内容右移一位
if(RXD2)
uart2_rx.buff[uart2_rx.count]|=0x80; //I/O是1,置D7位为1
uart2_rx.rx_bitcont--; //位数减一(共需移8位)
if(uart2_rx.rx_bitcont==0)
{
uart2_rx.rx_state=RX_STOP_BIT; //8位接收完,准备接收停止位.
}
}break;
case RX_STOP_BIT: //为接收的停止位,重置下降沿的起始位
{
CCAPM3=NEG_CAP_INT; //置为下降沿捕捉中断方式
if(RXD2) //停止位应是1,如果是零,非正确数据,丢弃
{
uart2_rx.count++ ; //是正确数据,接收的数据个数加一
uart2_rx.no_data_count = 0 ; //置有接收到的数据标志
}
uart2_rx.rx_state=RX_START_EDGE;
}break;
default :break;
}
}
}
//=================================================================
void UART_SST_init(void) //PCA 初始化
{
//CMOD = 0x01 ; //CIDL=0,WDTE=0,CPS1 CPS0=00 Fosc/12 ,/ECF=1
CMOD = 0x03 ; //CIDL=0,WDTE=0,CPS1 CPS0=01 Fosc/12 ,/ECF=1 //TBY20060223:改为PCA采用4分频的时钟,以提高波特率为4800*3=11400
CCON= 0X0;
CL = 0X0; //PCA计数器初设为00
CH = 0X0;
CCAPM0 = DISABLE_MODE ; //禁止PCA0的操作
CCAPM1 = DISABLE_MODE ; //禁止PCA1的操作
CCAPM2 = DISABLE_MODE ; //禁止PCA2的操作
CCAPM3 = DISABLE_MODE ; //禁止PCA3的操作
PPC = 1; //置PCA中断为最高级
IPH |= 0x40;//highest PRI //置PCA中断为最高级
EC = 1; //PCA中断允许
AUXR &=0xfd; //选择EXRAM作为UART的缓冲区
uart1_rx.no_data_count = 0 ;
uart1_tx.tx_state = 0xff ;
uart2_rx.no_data_count = 0 ;
uart2_tx.tx_state = 0xff ;
}
//==================UART1==============================
void UART1_tx_enable(void) //PCA 的UART发送允许
{
CH=0; //PCA计数器初置为00
CL=0;
CCAP0L=FULL_SPEEDL; //软件定时的长度为一位的时间长度
CCAP0H=FULL_SPEEDH;
CCAPM0= TIME_INIT;//01001001 //置为软件定时器中断方式
uart1_tx.count=0x0; //发送的个数初设为00
uart1_tx.tx_state=TX_START_BIT; //发送的初始状态为发送起始位
CR = 1;
}
/*pca receive enable*/
void UART1_rx_enable(void) //允许PCA 的UART接收
{
CCAPM1=NEG_CAP_INT; //置为下降沿捕捉中断方式
uart1_rx.rx_state=RX_START_EDGE; //接收的起始状态为下降沿触发
uart1_rx.count=0x00; //接收的数量初设为00
CR = 1;//attention: CR didn't stop at discretion ,
}
//-----------------------------------
void UART1_rx_disable(void)
{
CCAPM1=DISABLE_MODE; //禁止PCA1的操作
uart1_rx.rx_state=RX_START_EDGE; //接收状态恢复到开始的下降沿
}
//-----------------------------------
void UART1_send_out ( uchar *p , uint len ) //发送以P地址开始的单元内容,发送个数为LEN
{
uint j ;
if(uart1_tx.tx_state==0xff)
{
uart1_tx.len = len ; //置发送的数据长度
for ( j = 0 ; j < len ; j++ )
{
uart1_tx.buff[j] = *p ; //搬移至UART1的发送缓冲区内
p++ ;
}
UART1_tx_enable( ); //打开PCA的UART发送
}
}
//==================UART2==============================
void UART2_tx_enable(void) //PCA 的UART发送允许
{
CH=0; //PCA计数器初置为00
CL=0;
CCAP2L=FULL_SPEEDL; //软件定时的长度为一位的时间长度
CCAP2H=FULL_SPEEDH;
CCAPM2= TIME_INIT;//01001001 //置为软件定时器中断方式
uart2_tx.count=0x0; //发送的个数初设为00
uart2_tx.tx_state=TX_START_BIT; //发送的初始状态为发送起始位
CR = 1;
}
void UART2_rx_enable(void) //允许PCA 的UART接收
{
CCAPM3=NEG_CAP_INT; //置为下降沿捕捉中断方式
uart2_rx.rx_state=RX_START_EDGE; //接收的起始状态为下降沿触发
uart2_rx.count=0x00; //接收的数量初设为00
CR = 1;//attention: CR didn't stop at discretion ,
}
//-----------------------------------
void UART2_rx_disable(void)
{
CCAPM3=DISABLE_MODE; //禁止PCA1的操作
uart2_rx.rx_state=RX_START_EDGE; //接收状态恢复到开始的下降沿
}
//-----------------------------------
void UART2_send_out ( uchar *p , uint len ) //发送以P地址开始的单元内容,发送个数为LEN
{
uint j ;
if(uart2_tx.tx_state==0xff)
{
uart2_tx.len = len ; //置发送的数据长度
for ( j = 0 ; j < len ; j++ )
{
uart2_tx.buff[j] = *p ; //搬移至uart2的发送缓冲区内
p++ ;
}
UART2_tx_enable( ); //pca_tx_ena( ); //打开PCA的UART发送
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -