一、概述

RVB2601是基于平头哥生态芯片CH2601的开发板,板载JTAG调试器,WiFi&BLE芯片W800,音频ADCES7210,音频DACES8156,128x64 OLED屏幕,RGB三色指示灯,用户按键,及兼容Arduino的扩展接口,功能很多,接口很丰富,通过短接片,从两排插针引出相应的功能,目前短接片已经插得满满的了,如果还需要一些I/O点,连接外围传感器、继电器,该怎么办?

IO扩展有很多种方式,采用译码器,用74系列的74HC138(三八译码器),只需要3个IO口就可以扩展成8个输入口:输入极性。

串行数据移位,74HC595、74HC164同样也可以用少量IO口扩展成更多的IO口,而且支持级联,也是一种不错的选择:

总线接口,MCP23017(IIC接口)和MCP23S17(SPI接口)扩展模块:推荐使用I2C 串行接口的16位 I/O 扩展模块。

二、IIC串行接口

CH2601的内部设计有IIC总线,板子上的I2C总线与ES7210连接,ES7210芯片是四通道ADC采集芯片,在板子上连接了硅麦,ES7210的数据是通过I2S总线连接的CH2601,芯片的配置是通过IIC连接到CH2601,IIC接口被占用,只能另外想办法。

用普通I/O口,按照IIC的通信协议,软件模拟IIC时序逻辑,切换高低电平,实现IIC串行接口的功能,只需占用两个引脚,通过GPIO连接外设。具体实现方法请参考另外一篇博文,使用CDK在RVB2061上编写IIC软件驱动——快来测体温队。

三、扩展模块

IIC接口的MCP23017只需要两个IO口,便可以实现最多16*8=128个IO口的扩展,其中,16为每个芯片的最大IO口,8为最大地址数量,因为只有3个地址控制位,所以最大只能设置8个地址,MCP23017能够将16位并行数据转换为IIC接口的串型数据并可相互转化,MCP23017芯片IO口的模式可以任意设置为输入或输出模式,所以,我们可以在这扩展的最大的128个IO口中,任意搭配出不同的输入口和输出口。

接口电路:

模块控制接口采用的是双排接口,每个标号同时有两个排针,这样方便多个模块并联接线,免得从单片机开发板引出多根线到每个模块。 控制接口包括SCL、SDA、RST、ITA、ITB。

RST接到低电平时,芯片复位,在板上有一个10K欧姆的上拉电阻将RST拉到了VCC,如果不需要通过单片机控制芯片复位,在使用模块时,此引脚可不接线。

ITA、ITB是中断输出引脚,ITA对应GPIOA上的输入中断,ITB对应GPIOB 上的输入中断。不使用中断可不接,使用中断时可接到单片机的外部中断引脚上。ITA、ITB可联合在一起使用,即当16 个IO上任何一个中断输入产生中断时,ITA和ITB同时产生中断输出。具体在驱动函数的MCP23017 初始化函数中配置。ITA、ITB的输出类型可设置位 OD输出,推挽输出-高电平有效,推挽输出-低电平有效,具体在具体在驱动函数的MCP23017 初始化函数中

四、程序设计

扩展I/O功能实现:

1. 设置引脚模式:输入模式、输出模式、上拉输入模式(内部上拉电阻100KΩ);

2. 读取并设置引脚电平值;

3. 支持5种中断方式:高电平中断、低电平中断、上升沿中断、下降沿中断、双边沿跳变中断;

4. 支持2路中断信号输出:当端口A的某个引脚发生中断时,INTA引脚输出高电平,当端口B的某个引脚发生中断,INTB引脚输出高电平;

5. 轮询中断:可通过轮询中断函数,检测引脚是否发生中断,并执行相应的中断服务函数;

定义IIC接口操作函数:

extern void OpenI2C(unsigned char sync_mode, unsigned char slew);
extern void I2CStart(void);
extern void I2CReStart(void);
extern void I2CStop(void);
extern unsigned char WaitForACK(void);
extern void ACKI2C(void);
extern unsigned char WriteI2C(unsigned char data_out);
extern unsigned char ReadI2C(void);
extern void nACK(void);
extern unsigned char I2CDataReady(void);unsigned char WriteI2C( unsigned char data_out )
{unsigned char n;SCL_L;                 //SCL LOW... just in casefor(n=0; n<8; n++){if((data_out << n) & 0x80){SDA_H;SCL_H;SCL_L;}else{SDA_L;SCL_H;SCL_L;}}return 0;
}unsigned char ReadI2C(void)
{unsigned char n, data_in;data_in = 0;for(n=0; n<8; n++){SCL_H;data_in = ((data_in + SDA_LEVEL) << 1);SCL_L;}data_in = data_in >> 1;return(data_in);
}

定义MSCP23017寄存器操作数:

#define IODIRA       0x00
#define IODIRB      0x01
#define IPOLA       0x02
#define IPOLB       0x03
#define GPINTENA    0x04
#define GPINTENB    0x05
#define DEFVALA     0x06
#define DEFVALB     0x07
#define INTCONA     0x08
#define INTCONB     0x09
#define IOCONA      0x0A
#define IOCONB      0x0B
#define GPPUA       0x0C
#define GPPUB       0x0D
#define INTFA       0x0E
#define INTFB       0x0F
#define INTCAPA     0x010
#define INTCAPB     0x011
#define GPIOA       0x012
#define GPIOB       0x013
#define OLATA       0x014
#define OLATB       0x015

定义MCP23017操作函数:

#define WrtCmd  0
#define RdCmd   1
unsigned char gAddrPins = 0;
unsigned char I2CBaudGenerator = 125;
unsigned char SerialMode = I2CMODE;
unsigned char gControlByte = 0x40;void InitMCP( void )
{
//Configure 23017Write23X17(GPPUA,  0x0F);   // PullupsWrite23X17(IOCONA, 0x40);    //Write23X17(IODIRA, 0xFF);   //All inputs by default (this is the POR default)Write23X17(IODIRB, 0xFF);   //All inputs by default (this is the POR default)
}
//****************************************
//  I2CWriteByte(unsigned char addr, unsigned char byte)
//  Writes a byte to the 23017
//****************************************
void I2CWriteByte(unsigned char reg, unsigned char data)
{I2CStart();WriteI2C( gControlByte | WrtCmd | gAddrPins );WaitForACK();WriteI2C( reg );WaitForACK();WriteI2C( data );WaitForACK();I2CStop();
}//****************************************
//  int I2CReadByte(unsigned char addr))
//  Reads a byte from the 23008
//****************************************
unsigned char I2CReadByte(unsigned char reg)
{unsigned char num;I2CStart();WriteI2C( gControlByte | WrtCmd | gAddrPins );WaitForACK();WriteI2C( reg );WaitForACK();I2CReStart();;WriteI2C( gControlByte | RdCmd | gAddrPins );WaitForACK();num = ReadI2C();nACK();I2CStop();return(num);
}void Write23X17(unsigned char reg, unsigned char data)
{I2CWriteByte(reg, data); //
}unsigned char Read23X17(unsigned char reg)
{unsigned char num;num = I2CReadByte(reg);return(num);
}

五、参考资料

1、芯片手册

2、51单片机扩展I/O例程

【平头哥RVB2601开发板试用体验】I/O扩展相关推荐

  1. 【平头哥RVB2601开发板试用体验】AT解析器和通过w800 AT命令接入阿里云生活物联网平台

    作者:niu 在RVB2601开发板上,CH2601主芯片通过SPI接口和W800 WIFi/BLE模块通信,W800芯片在此接口上提供AT命令的方式供主芯片使用W800的功能. 根据<W800 ...

  2. 【平头哥RVB2601开发板试用体验】基于NTP的网络校时及WIFI驱动Bug调试

    作者:czxin NTP全称Network time Protocol,即网络时间协议,顾名思义就是通过与网络服务器之间通信来达到时间校准的协议,它是基于UDP的协议,记住这里的UDP,和后面遇到的W ...

  3. 【平头哥RVB2601开发板试用体验】基于 HTTPClient 的云语音识别 1

    作者:哈猪猪 前言 本系列共有三篇文章,目的是在 RVB2601 上实现基于 HTTPClient 组件的云语音识别.文章连接与主要内容如下: 文章1:设计思路:HTTPClient 组件测试 文章2 ...

  4. qt工程在linux系统里颜色显示错误_【飞凌嵌入式RK3399开发板试用体验】+QT开发环境搭建测试(二)...

    作者:飞扬的青春 在拿到开发板之后,已经体验了Android操作系统,接下来就是体验Linux下的开发,本次以QT的一个小案例来测试下. 首先是自己先搭建了一个Ubuntu18.04的虚拟机,使用真机 ...

  5. 飞凌嵌入式iMX8MP 开发板试用体验--编译内核源码

    FETMX8MP-C核心板基于NXP i.MX 8M Plus处理器开发设计,该系列处理器专注于机器学习与视觉.高级多媒体以及具有高可靠性的工业自动化.旨在满足智慧城市.工业互联网.智能医疗.智慧交通 ...

  6. RVB2601开发板试用5——远程音频采集系统

    本文作者:我爱下载 1.概述 远程音频采集系统利用RVB2601的ES7210麦克风数字化采样,W800的WiFi通讯和OLED液晶显示相关信息,进行音频收集和存储.开发专用的上位软件,通过以太网通讯 ...

  7. 【软通动力鸿湖万联扬帆系列“竞”开发板试用体验】折腾”竞“开发板

    前言 笔者在电子发烧友论坛参与了开发板试用,很荣幸能够通过[OH专题]软通动力扬帆系列"竞"OpenHarmony开发板免费试用审核,成为"竞"开发板体验者之一 ...

  8. 平头哥RVB2601开发板实现LED彩灯

    本文基于开发板RVB2601,测试LED控制程序,简要介绍新建项目,引脚初始化,rtos任务管理,引脚控制,OLED信息显示,串口打印调试信息 一.概述 1.RVB2601是基于平头哥生态芯片CH26 ...

  9. RVB2601开发板试用3——以太网通讯测试

    本文作者:我爱下载 1.概述 RVB2601中集成的CH2601通过W800提供了AT透传的wifi 功能,可以完成和外界进行数据交换的需要. 2.驱动描述 2.1 硬件接口原理 CH2601采用SP ...

最新文章

  1. 阿里全球数学竞赛第二届
  2. Java NIO框架Mina
  3. SolrClient或SolrTemplate写入时连接solr服务器超时问题的一种解决方案
  4. shell脚本 猜数字游戏并计数比较次数
  5. Java虚拟机的什么周期
  6. Arthas排查生产环境CPU飚高问题
  7. 使用Sqlloader处理数据
  8. 区块链会议_2018杭州云栖大会区块链相关_20180919
  9. 羡慕别人表格做的快?6个Excel小技巧+25个Excel快捷键!收藏没错
  10. 基金交易席位的制度沿袭
  11. 华为od与中软外包哪个更好_真惨!入职中软一个月(外包华为)就离职了~
  12. LVGL 8.2图片缩放及旋转
  13. 淘管家一键铺货怎么弄?和分销下单有什么区别?
  14. sshd: no hostkeys available — exiting
  15. windows 命令大全
  16. 基于微信小程序的高校体育场地预约管理系统
  17. html前端小教程—各浏览器兼容视频插入方法
  18. FFT(傅里叶快速变换算法)计算频率
  19. 阿里java面试复盘 | 三面解说(已通过)
  20. IT服务公司经理专栏:小公司管理(1)

热门文章

  1. 解决npm和node升级步骤
  2. 从 xp_cmdshell 中使用 dtexec 运行SSIS包
  3. python3 使用openpyxl 处理excel表格数据
  4. Android获取IMEI码及利用方法
  5. 数字孪生医院的智能化运营平台建设内容
  6. 【译】迁移被废弃的Kotlin Android Extensions插件
  7. 一个屌丝程序猿的人生(八十二)
  8. Redhat更换yum源
  9. 2022年我国高性能纤维及复合材料产业链全景图及上中下游市场剖析
  10. 新版二级域名分发平台源码+带教程/界面很可爱