|
串口七日 之 创世纪篇
作者:程序匠人
Ø 第三日
============================
圣经创世纪篇之第三日
上帝说:“普天之下的水要聚在一处,使旱地露出来。”
于是,水和旱地便分开。上帝称旱地为大陆,称众水聚积之处为海洋。
上帝又吩咐,地上要长出青草和各种各样的开花结籽的蔬菜及结果子的树,果子都包着核。
世界便照上帝的话成就了。
============================
串口创世纪篇之第三日
匠人说:“单片机串口底层驱动程序要聚在一处,使通讯建立起来”
于是,通讯便照匠人的话建立起来了。
以下为MCHC908芯片串口底层驱动例程,请大伙在转贴时要注明,它的作者是匠人,不是上帝(这一点千万注意,哈哈)。
//----------------------
//串行口初始化
//说明: 波特率为9600(设总线频率=8003584HZ)
//----------------------
void SCI_Init(void)
{
COMM_SEND_EN_T = 0 ; //通信发送使能标志=0
COMM_DELAY_JSQ = 0 ; //通讯延时计数器=0
COMM_BUF[0] = 0 ; //通讯缓冲区首字节=0
COMM_JSQ = 0 ; //通讯计数器(缓冲器指针)=0
SCBR = 0b10110010 ; //通讯时钟源=总线频率,定义波特率Bt=8003584HZ/(64*13*1)=9620
SCC1 = 0b01000000 ; //设置允许SCI,正常码输出,8位数据,无校验
SCC2 = 0b00101100 ; //允许接收中断,设置允许发送,允许接收,查询方式收发
}
//----------------------
//接收中断处理函数
//说明: 将本次接受的值保存到通讯缓冲区
// 当缓冲器溢出时,通讯缓冲区的第1个字节=0,将发送错误报告给计算机
// 当一帧数据接受完毕时,
//----------------------
interrupt IV_SCI_RX void int_SCI_RX (void)
{
if (SCS1_SCRF)
{
COMM_DELAY_JSQ = 0 ; //通讯延时计数器=0
COMM_BUF[COMM_JSQ] = SCDR ; //保存本次接受到的值
COMM_JSQ ++ ; //通讯计数器(缓冲器指针)+1
if ( COMM_JSQ > COMM_BUF_NUM )
//当缓冲器溢出时
{
COMM_BUF[0] = 0 ; //通讯缓冲区首字节=0,将发送错误报告给计算机
COMM_JSQ = 1 ; //接收计数器=1
COMM_SEND_EN_T = 1 ; //通信发送使能标志=1
}
//当缓冲器未溢出时
else if ( COMM_JSQ >= COMM_BUF[0] ) //判断是否接收完一帧数据 (说明:通讯缓冲区首字节 代表本帧数据的字节数)
//当一帧数据接受完毕
{
COMM_SEND_EN_T = 1 ; //通信发送使能标志=1
}
}
}
//----------------------
//串行发送1个字节
//功能: 串行发送1个字节
//入口: buf=要发送的数据
//----------------------
void SCI_Send_1(tU08 buf)
{
for(;;)
{
if (SCS1_SCTE) //当SCDR为空时
{
SCDR=buf;
break;
}
}
delay_n_ms(3); //延时3ms
}
//----------------------
//串行发送N个字节
//功能: 发送通讯缓冲区中的N个字节数据
//入口: COMM_BUF[COMM_BUF_NUM]=通讯缓冲区,通讯缓冲区首字节=帧长(N)
//----------------------
void SCI_Send_N(void)
{
for(COMM_JSQ=0 ; COMM_JSQ < COMM_BUF[0] ; COMM_JSQ++ )
{
SCI_Send_1(COMM_BUF[COMM_JSQ]);
}
}
待续……
============================ |