很多单片机,比如51单片机,只有一个或两个串口。所以,有时会遇到串口不够用的情况,这时候可以换一款串口更多的单片机。而有时你又不想换一款单片机,那可以使用本文要介绍的通过IIC来扩展串口的芯片。
成都为开微电子,在串口扩展芯片上有很多选择,有2个串口、4个串口等。本文以2串口的WK2132为例进行介绍。二话不说,先上简介。
WK串口芯片的特色,在于每个串口有256级FIFO,这可以节省你的单片机的RAM,同时,不容易因为没读取WK接收缓冲里的数据而使缓冲区溢出。
在我的串口扩展模块中,使用IIC来操作WK,它的好处是有应答信号,可以知道WK芯片是否正常工作。上电路图
SCL、SDA接到单片机就可以了,IRQ是中断信号,可不接,单片机采用查询方式来检测是否有接收到数据。R7~R10用来选择IIC地址,这样可以用同一个IIC线最多接4个扩展模块,8个串口。
我的模块中,还可以选择TTL输出还是232输出。
现在来上代码
main()
{
//P1.6為IIC SDA引腳,配置成開漏,輸出高電平
//P1.7為IIC SCL引腳,配置成開漏,輸出高電平
P1M0 |= (1<<6) | (1<<7);
P1M1 |= (1<<6) | (1<<7);
P1 |= (1<<6) | (1<<7);
WK21xx_Init();
while(1)
{
//测试自收自发
WK21xx_UARTxRcv(0, a, &RcvNum);
if (RcvNum)
{
WK21xx_UARTxSend(0, a, RcvNum);
}
WK21xx_UARTxRcv(1, a, &RcvNum);
if (RcvNum)
{
WK21xx_UARTxSend(1, a, RcvNum);
}
}
}
先配置一下I2C的IO口,然后调用一下WK21xx_Init(),接下来就可以用WK21xx_UARTxRcv读取接收缓存里的数据,以及用WK21xx_UARTxSendByte和WK21xx_UARTxSend发送数据了。
WK的驱动如下
/*********************************************************************************************************
** Func: WK21xx串口初始化
** Input: UARTx: 串口号, 0~15
** Return: 成功返回1,失败返回0
** Remarks: WK21xx串口初始化
*********************************************************************************************************/
unsigned