5

CH9434-MCU代码移植,芯片使用详细说明(附Linux开发资料链接) - 我叫搞事情

 1 year ago
source link: https://www.cnblogs.com/mj19971221/p/17012856.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

CH9434-MCU代码移植,芯片使用详细说明(附Linux开发资料链接)

简介

CH9434是一款SPI转四串口转接芯片,提供四组全双工的9线异步串口,用于单片机/嵌入式/安卓系统扩展异步串口。提供25路GPIO,以及支持RS485收发控制引脚TNOW。本篇基于STM32F103,介绍CH9434在MCU平台移植和使用方法。

Linux移植说明可以跳转到这个链接:https://blog.csdn.net/WCH_TechGroup/article/details/128288016

本次移植的最终代码工程可以去个人Gitee下载:https://gitee.com/maji19971221/wch_-per#202214

CH9434EVT下载链接:https://www.wch.cn/downloads/CH9434EVT_ZIP.html

移植说明

1. 找一个最简单的MCU的SPI代码。

2319047-20221229161005944-798002227.png

2. 去WCH官网下载CH9434EVT.ZIP,找到里面MCU的驱动代码。CH9434.c和CH9434.h复制到工程里面。

2319047-20221229161657413-1143454499.png

3. 因为不同MCU,SPI的首发,以及自己写的CS的拉高拉低和CH9434.c有区别。把里面的CH9434_SPI_SCS_OP;CH9434_SPI_WRITE_BYTE函数改为自己MCU的写法或者把自己的代码在外面封一层函数就行了。我这边选择再封了一层函数,不去修改驱动文件。

2319047-20221229161657431-700994312.png

4. 接下来需要判断主控和CH9434之间是否保持一个正常的接口通讯。芯片这里预留了一个用户自定义寄存器(SCR寄存器),可以通过往这个寄存器写入随机值再读出,看读出值是否为刚刚写入的值,如果不是那就是接口通讯异常,问题有以下几个可能:

a)      CH9434的硬件存在问题。硬件问题判断方向比较多。可以通过看芯片的VCORE(33)脚的电压(1.05V-1.1V),以及外部32M晶振是否振荡做一个基础的判断。常见的一些硬件设计问题包括:1. CH9434的3个VDD脚没有外部短接,这个是在硬件设计时比较容易犯的错误,芯片的3个VDD(1,2,35)脚如果没外部短接,芯片无法正常工作。2. PCB封装画错,沁恒目前只提供AD的元器件封装库,对于使用Candence等EDA工具的需要自己建立元器件库,而CH9434A的封装并不是每边引脚数量一致,这个就会导致部分PCB工程师在绘制时出错。

b)      软件时序问题。CH9434A的时序图如下(使用DsView抓包获得)。可以看到,CH9434的正常通讯时序是在一个CS低电平里面有两个字节的数据(命令+数据),并且命令和数据之间要保持至少3us的间隔。没有按照这个要求,芯片可能就无法正常识别主机发过来的数据,从而通讯失败。

2319047-20221229161657402-783371932.png

5. 程序添加SCR读写操作代码,判断接口通讯是否正常。

2319047-20221229161657383-189045080.png

2319047-20221229161657375-947478781.png

正常的话读取数据就是0x55,通讯异常就是其它数据。这样和9434最基础的通讯代码就已经完成了。

功能测试

串口功能测试

首先需要初始化时钟和串口,初始化的代码,可以参考EVT中的main函数。因为都已经封装好了函数,用户实际只需要调用库函数,给入对应的实参即可。这边拿其中的串口0(0-3)举例。CH9434的4个串口都是独立的,每个串口的寄存器都有独立的寄存器地址,所以需要根据自己实际需要使用几个串口去做对应的初始化设置。芯片本身的串口是TTL,但是也支持流控和485Tnow的使能控制,如果需要使用只需要将代码这边对应的宏定义打开即可。

2319047-20221229161657504-1380350143.png
2319047-20221229161657408-1596494703.png

通过EXIT_INT宏定义选择使用while(1)查询方式还是使用INT外部中断的方式去做。需要注意的是,CH9434的中断方式是低电平触发,目前部分MCU仅支持下降沿触发,此时就需要在外部中断服务函数里面加上INT引脚判断,直到INT变高才退出外部中断服务函数。

将CH9434EVT里面的main函数处理复制到自己的工程。这里的代码做的功能就是回传(收到什么回传什么)。整个代码的处理流程逻辑如下:

2319047-20221229161657397-242519952.png

最终实现的效果就是串口收到什么就回传什么数据。

2319047-20221229161657503-1039773074.png
2319047-20221229161657531-968777812.png

RS485功能测试

评估版通过跳帽将芯片的串口链接到485芯片。程序方面只需要打开RS485宏定义。

和TTL的初始化代码区别就是多了一个RS485 TNOW使能的初始化,读写的程序流程和前面的TTL保持一致。

 

2319047-20221229161800987-1938050198.png
2319047-20221229191454710-1363034353.png

最终实测效果也是一样,实现的效果就是串口收到什么就回传什么数据。

2319047-20221229161801544-1399835145.png

Modem流控功能测试

程序中将开启流控的宏定义打开。和TTL的初始化代码区别就是多了一步流控的使能以及RTS和DTR引脚的电平状态设置,读写的程序流程和前面的TTL保持一致。

2319047-20221229161918797-1835145762.png
2319047-20221229161918969-456514484.png

打开串口工具的RTS使能,即可实现正常的数据收发。

2319047-20221229161918699-1809088771.png

GPIO功能测试

将GPIO_Test宏定义打开,本次代码是将GPIO0-12作为推挽输出,GPIO13-25作为上拉输入读取电平状态。

2319047-20221229161918751-903228197.png

程序下载,如图,随机拿GPIO10链接一个LED灯。实现闪烁效果。

2319047-20221229161918866-815464833.png
2319047-20221229161918804-907830770.png

随机将GPIO19接地,程序打印正常读取。

2319047-20221229161918763-1315021119.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK