很多单片机,比如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 char WK21xx_UARTxInit(unsigned char UARTx, unsigned long Baud)
{unsigned long BaudReg = WK21xx_CLK / 16 * 100 / Baud;unsigned short BaudReg_IntPart = BaudReg / 100 - 1;unsigned short BaudRegB = BaudReg % 100 << 4;unsigned char BaudReg_DecPart = BaudRegB / 100;if (BaudRegB%100 >= 50){BaudReg_DecPart += 1;}if (!WK21xx_WriteSubReg(UARTx, REG_SPAGE_ADDR, 1)) return 0;       //选择寄存器页if (!WK21xx_WriteSubReg(UARTx, REG_BAUD1_ADDR, BaudReg_IntPart>>8)) return 0;     //设置波特率if (!WK21xx_WriteSubReg(UARTx, REG_BAUD0_ADDR, BaudReg_IntPart)) return 0;        //设置波特率if (!WK21xx_WriteSubReg(UARTx, REG_PRES_ADDR, BaudReg_DecPart)) return 0;         //设置波特率if (!WK21xx_WriteSubReg(UARTx, REG_SPAGE_ADDR, 0)) return 0;        //选择寄存器页if (!WK21xx_WriteSubReg(UARTx, REG_SCR_ADDR, 0x03)) return 0;       //使能串口发送和接收if (!WK21xx_WriteSubReg(UARTx, REG_LCR_ADDR, (0 << 3)             //0 No parity; 1 Enable parity| (0 << 1)           //0 Force 0 parity; 1 Odd parity; 2 Even parity; 3 Force 1 parity| 0)) return 0;      //0 1 stop bit; 1 2 stop bitif (!WK21xx_WriteSubReg(UARTx, REG_FCR_ADDR, 0x0f)) return 0;      //使能并重置FIFOif (!WK21xx_WriteSubReg(UARTx, REG_SIER_ADDR, 0)) return 0;        //禁止所有子串口中断   return 1;
}/*********************************************************************************************************
** Func:    WK21xx初始化
** Input:   无
** Return:   成功返回1,失败返回0
** Remarks: WK21xx初始化
*********************************************************************************************************/
unsigned char WK21xx_Init(void)
{I2C_PinInit();//全局初始化if (!WK21xx_WriteGlobalReg(0, REG_GENA_ADDR, 0x03)) return 0;     //使能子串口时钟if (!WK21xx_WriteGlobalReg(0, REG_GMUT_ADDR, (0 << 3)             //0 No parity; 1 Enable parity| (0 << 1)           //0 Force 0 parity; 1 Odd parity; 2 Even parity; 3 Force 1 parity| 0)) return 0;      //0 1 stop bit; 1 2 stop bitif (!WK21xx_WriteGlobalReg(0, REG_GIER_ADDR, 0)) return 0;     //禁止全局串口中断//子串口初始化if (!WK21xx_UARTxInit(0, WK21xx_UART0_BAUD)) return 0;if (!WK21xx_UARTxInit(1, WK21xx_UART1_BAUD)) return 0;return 1;
}/*********************************************************************************************************
** Func:    WK21xx UARTx发送一个字节
** Input:   UARTx: 串口号, 0~15
** Input:   Data: 要发送的字节
** Output:  无
** Return:   成功返回1,失败返回0
** Remarks: 同步模式,发送完毕函数才返回
*********************************************************************************************************/
unsigned char  WK21xx_UARTxSendByte(unsigned char UARTx, unsigned char Data)
{unsigned char FsrReg;if (!WK21xx_WriteFIFO(UARTx, &Data, 1)) return 0;while (1){if (!WK21xx_ReadSubReg(UARTx, REG_FSR_ADDR, &FsrReg)){return 0;}if ((FsrReg & 0x05) == 0){return 1;}}
}/*********************************************************************************************************
** Func:    WK21xx UARTx发送数据
** Input:   UARTx: 串口号, 0~15
** Input:   pData: 要发送的数据
** Input:   Num: 要发送的字节数
** Output:  None
** Return:   成功返回1,失败返回0
** Remarks: 同步模式,发送完毕函数才返回
*********************************************************************************************************/
unsigned char WK21xx_UARTxSend(unsigned char UARTx, unsigned char *pData, unsigned char Num)
{unsigned char FsrReg;if (!WK21xx_WriteFIFO(UARTx, pData, Num)) return 0;while (1){if (!WK21xx_ReadSubReg(UARTx, REG_FSR_ADDR, &FsrReg)){return 0;}if ((FsrReg & 0x05) == 0){return 1;}}
}/*********************************************************************************************************
** Func:    WK21xx UARTx读取数据
** Input:   UARTx: 串口号, 0~15
** Output:  pData: 存放读取到的数据的指针
** Output:   pRcvNum: 读取到的字节数
** Return:   成功返回1,失败返回0
** Remarks: 数据最多256个
*********************************************************************************************************/
unsigned char WK21xx_UARTxRcv(unsigned char UARTx, unsigned char *pData, unsigned char *pRcvNum)
{unsigned char RcvNum;if (!WK21xx_ReadSubReg(UARTx, REG_RFCNT_ADDR, &RcvNum)){*pRcvNum = 0;return 0;}if (RcvNum == 0){*pRcvNum = 0;return 1;}if (!WK21xx_ReadFIFO(UARTx, pData, RcvNum)){*pRcvNum = 0;return 0;}*pRcvNum = RcvNum;return 1;
}

 后面附上源码,有兴趣可以查看
WK2132驱动 C语言源码

WK系列串口扩展芯片详解(含电路例程)相关推荐

  1. 基于EP4CE10F17C8N芯片详解Altera Cyclone系列器件命名规则

    这里写自定义目录标题 Altera的Cyclone系列器件命名规则如下 器件系列 + 器件类型(是否含有高速串行收发器) + LE逻辑单元数量 + 封装类型 + 高速串行收发器的数量(没有则不写) + ...

  2. 陶晶驰stm32_陶晶驰HMI3.5寸串口屏的详解之梳理F4总结系列准备篇(二)

    基于stm32的串口屏教程.用过的人都说好,哈哈哈,减少了我们很多不太必要的麻烦步骤. 程序资料包CSDN下载地址:https://download.csdn.net/download/qq_3835 ...

  3. jQuery数组处理详解(含实例演示)

    jQuery的数组处理,便捷,功能齐全. 最近的项目中用到的比较多,深感实用,一步到位的封装了很多原生js数组不能企及的功能. 最近时间紧迫,今天抽了些时间回过头来看 jQuery中文文档 中对数组的 ...

  4. 大型网站系统架构系列:负载均衡详解(一)

    大型网站系统架构系列:负载均衡详解(一) 2016-03-20 架构说 面对大量用户访问.高并发请求,海量数据,可以使用高性能的服务器.大型数据库,存储设备,高性能Web服务器,采用高效率的编程语言比 ...

  5. 天猫精灵方糖拆解报告和芯片详解

    折腾: [记录]天猫精灵方糖拆解过程 后,下面详细整理关于芯片的信息. 总体截图: 各个单元: MEDIATEK ARM MT8516AAAA 1812-BZASH BET02027 ACMQPQ8K ...

  6. 【单片机基础篇】74HC595芯片详解

    74HC595芯片详解 芯片简述:74HC595是一个8位串行输入.并行输出的位移缓存器:并行输出为三态输出.在SCK 的上升沿,串行数据由SER输入到内部的8位位移缓存器,并由QA~QH'输出,而并 ...

  7. RxJS 系列之二 - Observable 详解

    查看新版教程,请访问前端修仙之路 RxJS 系列目录 RxJS 系列之一 - Functional Programming 简介 RxJS 系列之二 - Observable 详解 (本文) RxJS ...

  8. Zabbix+MatrixDB大规模监控与分析解决方案详解(含PPT)

    首先,谢谢原作者:(此文为转载的文章,现将原地址贴出如下:以下文章来源于yMatrix,作者MatrixDB团队Zabbix+MatrixDB大规模监控与分析解决方案详解(含PPT)) 更多精彩Zab ...

  9. zabbix 5系列之snmp监控详解

    更多精彩Zabbix文章.技术交流.免费技术培训加微号NateIT,免费获取zabbix安装.配置.优化技术培训视频 官网:http://ywzs.hanyunintel.com 首先,谢谢原作者: ...

  10. 计算机快捷方式后缀名,电脑快捷键-文件扩展名详解.doc

    电脑快捷键-文件扩展名详解 移张匪奶爪辣缔观爵恃国炉拂遗阻掌香纶笨艇躬块件部桑畜妒初贞坊乾貌怠渴汾牵敦滑柒页言旺抓估勺斯邓锚鹊山溶担岭椭碟蕉政粒恳法桅汹湛鱼巢睦痹堑冷牟歼丰顾江疤泰罢旁杏传英命痢纺康蛇 ...

最新文章

  1. 【题解】P1419 寻找段落(二分+单调队列)难度⭐⭐⭐★
  2. How to debug Custom Action DLL
  3. Redis持久化实践及灾难恢复模拟
  4. 为什么人们默认 x86 代表 32 位处理器
  5. python中os模块里有哪些类_python-os模块的常用方法
  6. (10)SPI发送verilog与Systemverilog编码
  7. 《Docker进阶与实战》——3.3节Docker image的组织结构
  8. Java学习之FileInputStream与FileReader的区别
  9. 【2021牛客暑期多校训练营6】H Hopping Rabbit(扫描线)
  10. 数据结构与算法(Python)第一天
  11. 闲来无事实现个备忘录,到点提醒
  12. 计算机雕刻教学设计,综合实践《果蔬雕刻》教学设计第一课时
  13. Python中round函数
  14. Android Timer和TimerTask解决IllegalStateException:Task already scheduled or cancelled
  15. minus oracle 顺序_Minus 在oracle 中的用法
  16. 鸿蒙大陆罪恶深渊哪里出,库库马力
  17. 解决克隆RHEL7后网络无法启动问题
  18. L1-005 考试座位号 (15 分)
  19. 【uni-app】懂你找图--创建项目到首页推荐模块
  20. 每日分享:DNS解析记录

热门文章

  1. iphone7p配置参数详情_苹果苹果7p配置参数表
  2. 阿里云-个人建网站从0到精通(二)-快速搭建网站
  3. 汽车CAN总线系统原理、设计与应用 第二章CAN总线的基本原理 ---- 个人自学笔记
  4. 2022-2027年中国小麦加工行业市场深度分析及投资战略规划报告
  5. 关于51芯片及引脚功能介绍与总结
  6. 向量积计算三角形面积
  7. python 马赛克拼图_用几十万张图片来拼图!Open CV牛逼不是没有道理的!马赛克拼图...
  8. opencv马赛克python实现
  9. # netstat -s
  10. YouTube批量下载开源代码汇总