很多单片机,比如51单片机,只有一个或两个串口。所以,有时会遇到串口不够用的情况,这时候可以换一款串口更多的单片机。而有时你又不想换一款单片机,那可以使用本文要介绍的八扩展串口芯片CH438。芯片是沁恒的,沁恒的芯片用了挺多,很有特色,质量也是很棒的。二话不说,先上简介。
CH438芯片的特色,在于单芯片有8个扩展串口,每个串口有128字节的FIFO,这可以节省你的单片机的RAM,同时,不容易因为没读取接收缓冲里的数据而使缓冲区溢出。CH438的访问接口是并行口,用的引脚比较多,数据脚和地址脚可共用。外围简单,只需要一个晶振。上电路图
现在来上代码
int main(void)
{
uint8_t UARTx;
InitSysClk(); //Initial system clock
InitSysTick(); //Initial sysTick timer, interrupt once per millisecond
PortConfig(); //IO Port configure, please modify this function to configure the IO port
CH438_PinInit();
for (UARTx=0; UARTx<16; UARTx++)
{
CH438_UARTxInit(UARTx);
}
while (1)
{
CH438SerialsProcess();
}
}
/*********************************************************************************************************
CH438 串口处理
*********************************************************************************************************/
void CH438SerialsProcess(void)
{
uint8_t UARTx;
uint8_t res;
for (UARTx=0; UARTx<16; UARTx++)
{
res = CH438_UARTxRcv(UARTx, CH438UARTRcvBuf, &CH438UARTRcvLen);
if (res == 0) //Hardware error
{
break;
}
if (CH438UARTRcvLen)
{
CH438_UARTxSend(UARTx, CH438UARTRcvBuf, CH438UARTRcvLen);
}
}
}
初始化时先调用CH438_PinInit()配置一下并口的IO口,然后调用一下CH438_UARTxInit(UARTx)配置各个串口,接下来就可以用CH438_UARTxRcv读取接收缓存里的数据,以及用CH438_UARTxSendByte和CH438_UARTxSend发送数据了。
CH438的驱动如下
/*********************************************************************************************************
** 功能: CH438引脚初始化
** 输入: 无
** 返回: 无
** 说明: CH438引脚初始化
*********************************************************************************************************/
void CH438_PinInit()
{
CH438_CSHigh();
CH438_ALELow();
CH438_WRHigh();
CH438_RDHigh();
}
/*********************************************************************************************************
** 功能: CH438写寄存器
** 输入: Addr:寄存器地址
** 输入: RegValue:寄存器值
** 返回: