云琴箫龙 发表于 2019-10-2 23:24:37

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   




eric2013 发表于 2019-10-3 00:57:41

非常感谢楼主分享

abcde1224 发表于 2019-10-3 09:01:17

感谢分享挺好的

hpdell 发表于 2021-1-16 09:58:53

这个芯片貌似不好买啊 在 淘宝上没有搜索到

CH351DS3

eric2013 发表于 2021-1-19 07:45:41

hpdell 发表于 2021-1-16 09:58
这个芯片貌似不好买啊 在 淘宝上没有搜索到

CH351DS3

35X系列,在沁恒官网貌似只有这个

http://www.wch.cn/application/345.html

eric2013 发表于 2021-1-19 07:46:30

hpdell 发表于 2021-1-16 09:58
这个芯片貌似不好买啊 在 淘宝上没有搜索到

CH351DS3

找到了,应该是这个

http://www.wch.cn/downloads/CH351DS3_PDF.html

hpdell 发表于 2021-1-19 08:47:00

eric2013 发表于 2021-1-19 07:46
找到了,应该是这个

http://www.wch.cn/downloads/CH351DS3_PDF.html

多谢多谢啊,看看捣鼓能否成功哟

hpdell 发表于 2021-1-19 08:59:16

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)));


eric2013 发表于 2021-1-19 12:37:53

hpdell 发表于 2021-1-19 08:59
请教下,这个 ch351 芯片,地址 端 A2-A0 是不是不用接,直接悬空即可啊 ?

在实际应用中,按照楼主提 ...
要接

hpdell 发表于 2021-1-19 13:01:30

eric2013 发表于 2021-1-19 12:37
要接

应该可以使用普通的 io 口输出高低电平进行控制吧,因为 FMC_Ax 的端口被其他的功能使用完了,

eric2013 发表于 2021-1-19 19:19:23

hpdell 发表于 2021-1-19 13:01
应该可以使用普通的 io 口输出高低电平进行控制吧,因为 FMC_Ax 的端口被其他的功能使用完了,

可以使用普通IO控制。

hpdell 发表于 2021-1-19 20:54:04

eric2013 发表于 2021-1-19 19:19
可以使用普通IO控制。

那就好办了,多谢多谢喔{:8:} {:33:}{:32:}

tigerdill 发表于 2021-1-21 13:27:58

并口外扩,需要IO还是太多
串口外扩,IIC接口,单片扩16路,最大可挂接8片
http://www.novosns.com/web/index.php?m=article&a=index&cid=4&id=1230

wqqq 发表于 2023-4-3 16:15:19

您好,博主,想请问一下这个I/O芯片与单片机如何连接的,可以分享一下电路原理图吗?

云琴箫龙 发表于 2023-5-19 16:03:30

wqqq 发表于 2023-4-3 16:15
您好,博主,想请问一下这个I/O芯片与单片机如何连接的,可以分享一下电路原理图吗?


原理比较简单,挂FMC总线上即可。

云琴箫龙 发表于 2023-5-19 16:05:20

tigerdill 发表于 2021-1-21 13:27
并口外扩,需要IO还是太多
串口外扩,IIC接口,单片扩16路,最大可挂接8片
http://www.novosns.com/web/i ...

最大的优势是速度快,如果对IO口速度没太高的要求,还是建议用I2C去外扩。
页: [1]
查看完整版本: IO专用扩展芯片,FMC接口