IO专用扩展芯片,FMC接口
最近新板子上用一款芯片扩展了多个双向IO口,相对于常见的245和574,这个感觉还挺好用的,分享给大家!型号是CH351DS3,几块钱的国产芯片,可以用8位并口扩展32个双向IO口。
项目上用8位FMC总线驱动的液晶屏,所以这个芯片顺带也挂在了8位FMC总线上,主要是用来扫描按键以及一些片选引脚用的。
软件操作很方便,借鉴了硬汉哥的FMC对bit位的操作,但是我的习惯是底层定义保持原生态,然后采用统一宏定义的方式去操作底层,这样的好处是程序容易移植,上层应用也不必考虑底层是扩展的IO口还是自带的IO口。
比如程序中如果想拉低WIFI的使能引脚,只需要WIFI_EN=0就可以,确实很方便,示例代码如下,仅供参考。
struct Ch351Drt{
uint8_t bit0 :1;
uint8_t bit1 :1;
uint8_t bit2 :1;
uint8_t bit3 :1;
uint8_t bit4 :1;
uint8_t bit5 :1;
uint8_t bit6 :1;
uint8_t bit7 :1;
};
(NE2上就挂了个IO口扩展芯片,所以没有再用译码器之类的芯片)
struct Ch351Drt *Ch351P0 = (struct Ch351Drt *)((0x64000000));
struct Ch351Drt *Ch351P1 = (struct Ch351Drt *)((0x64000000 + (1 << 6)));
struct Ch351Drt *Ch351P2 = (struct Ch351Drt *)((0x64000000 + (1 << 7)));
struct Ch351Drt *Ch351P3 = (struct Ch351Drt *)((0x64000000 + (1 << 7) + (1 << 6)));
#define MRF_GPIO0 Ch351P0->bit0
#define MRF_CS Ch351P0->bit1
#define MRF_SDN Ch351P0->bit2
#define WIFI_RST Ch351P0->bit3
#define WIFI_EN Ch351P0->bit4
#define SD_CS Ch351P0->bit5
#define POWER_EN Ch351P0->bit6
#define GT_CS Ch351P0->bit7
#define KEY_UP Ch351P1->bit0
#define KEY_DOWN Ch351P1->bit1
#define KEY_LEFT Ch351P1->bit2
#define KEY_RIGHT Ch351P1->bit3
#define KEY_ENTER Ch351P1->bit4
#define KEY_BACK Ch351P1->bit5
#define KEY_1 Ch351P1->bit6
#define KEY_2 Ch351P1->bit7
非常感谢楼主分享 感谢分享挺好的 这个芯片貌似不好买啊 在 淘宝上没有搜索到
CH351DS3 hpdell 发表于 2021-1-16 09:58
这个芯片貌似不好买啊 在 淘宝上没有搜索到
CH351DS3
35X系列,在沁恒官网貌似只有这个
http://www.wch.cn/application/345.html hpdell 发表于 2021-1-16 09:58
这个芯片貌似不好买啊 在 淘宝上没有搜索到
CH351DS3
找到了,应该是这个
http://www.wch.cn/downloads/CH351DS3_PDF.html eric2013 发表于 2021-1-19 07:46
找到了,应该是这个
http://www.wch.cn/downloads/CH351DS3_PDF.html
多谢多谢啊,看看捣鼓能否成功哟 eric2013 发表于 2021-1-19 07:46
找到了,应该是这个
http://www.wch.cn/downloads/CH351DS3_PDF.html
请教下,这个 ch351 芯片,地址 端 A2-A0 是不是不用接,直接悬空即可啊 ?
在实际应用中,按照楼主提供的方法重新定义即可啊??
吧楼主位 的 地址改成如下即可?
struct Ch351Drt *Ch351P0 = (struct Ch351Drt *)((0x64000000));
struct Ch351Drt *Ch351P1 = (struct Ch351Drt *)((0x64000000 + (1 << 20)));
struct Ch351Drt *Ch351P2 = (struct Ch351Drt *)((0x64000000 + (1 << 21)));
struct Ch351Drt *Ch351P3 = (struct Ch351Drt *)((0x64000000 + (1 << 21) + (1 << 20)));
hpdell 发表于 2021-1-19 08:59
请教下,这个 ch351 芯片,地址 端 A2-A0 是不是不用接,直接悬空即可啊 ?
在实际应用中,按照楼主提 ...
要接
eric2013 发表于 2021-1-19 12:37
要接
应该可以使用普通的 io 口输出高低电平进行控制吧,因为 FMC_Ax 的端口被其他的功能使用完了, hpdell 发表于 2021-1-19 13:01
应该可以使用普通的 io 口输出高低电平进行控制吧,因为 FMC_Ax 的端口被其他的功能使用完了,
可以使用普通IO控制。 eric2013 发表于 2021-1-19 19:19
可以使用普通IO控制。
那就好办了,多谢多谢喔{:8:} {:33:}{:32:} 并口外扩,需要IO还是太多
串口外扩,IIC接口,单片扩16路,最大可挂接8片
http://www.novosns.com/web/index.php?m=article&a=index&cid=4&id=1230 您好,博主,想请问一下这个I/O芯片与单片机如何连接的,可以分享一下电路原理图吗? wqqq 发表于 2023-4-3 16:15
您好,博主,想请问一下这个I/O芯片与单片机如何连接的,可以分享一下电路原理图吗?
原理比较简单,挂FMC总线上即可。
tigerdill 发表于 2021-1-21 13:27
并口外扩,需要IO还是太多
串口外扩,IIC接口,单片扩16路,最大可挂接8片
http://www.novosns.com/web/i ...
最大的优势是速度快,如果对IO口速度没太高的要求,还是建议用I2C去外扩。
页:
[1]