【平头哥RVB2601开发板试用体验】I/O扩展
一、概述
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扩展相关推荐
- 【平头哥RVB2601开发板试用体验】AT解析器和通过w800 AT命令接入阿里云生活物联网平台
作者:niu 在RVB2601开发板上,CH2601主芯片通过SPI接口和W800 WIFi/BLE模块通信,W800芯片在此接口上提供AT命令的方式供主芯片使用W800的功能. 根据<W800 ...
- 【平头哥RVB2601开发板试用体验】基于NTP的网络校时及WIFI驱动Bug调试
作者:czxin NTP全称Network time Protocol,即网络时间协议,顾名思义就是通过与网络服务器之间通信来达到时间校准的协议,它是基于UDP的协议,记住这里的UDP,和后面遇到的W ...
- 【平头哥RVB2601开发板试用体验】基于 HTTPClient 的云语音识别 1
作者:哈猪猪 前言 本系列共有三篇文章,目的是在 RVB2601 上实现基于 HTTPClient 组件的云语音识别.文章连接与主要内容如下: 文章1:设计思路:HTTPClient 组件测试 文章2 ...
- qt工程在linux系统里颜色显示错误_【飞凌嵌入式RK3399开发板试用体验】+QT开发环境搭建测试(二)...
作者:飞扬的青春 在拿到开发板之后,已经体验了Android操作系统,接下来就是体验Linux下的开发,本次以QT的一个小案例来测试下. 首先是自己先搭建了一个Ubuntu18.04的虚拟机,使用真机 ...
- 飞凌嵌入式iMX8MP 开发板试用体验--编译内核源码
FETMX8MP-C核心板基于NXP i.MX 8M Plus处理器开发设计,该系列处理器专注于机器学习与视觉.高级多媒体以及具有高可靠性的工业自动化.旨在满足智慧城市.工业互联网.智能医疗.智慧交通 ...
- RVB2601开发板试用5——远程音频采集系统
本文作者:我爱下载 1.概述 远程音频采集系统利用RVB2601的ES7210麦克风数字化采样,W800的WiFi通讯和OLED液晶显示相关信息,进行音频收集和存储.开发专用的上位软件,通过以太网通讯 ...
- 【软通动力鸿湖万联扬帆系列“竞”开发板试用体验】折腾”竞“开发板
前言 笔者在电子发烧友论坛参与了开发板试用,很荣幸能够通过[OH专题]软通动力扬帆系列"竞"OpenHarmony开发板免费试用审核,成为"竞"开发板体验者之一 ...
- 平头哥RVB2601开发板实现LED彩灯
本文基于开发板RVB2601,测试LED控制程序,简要介绍新建项目,引脚初始化,rtos任务管理,引脚控制,OLED信息显示,串口打印调试信息 一.概述 1.RVB2601是基于平头哥生态芯片CH26 ...
- RVB2601开发板试用3——以太网通讯测试
本文作者:我爱下载 1.概述 RVB2601中集成的CH2601通过W800提供了AT透传的wifi 功能,可以完成和外界进行数据交换的需要. 2.驱动描述 2.1 硬件接口原理 CH2601采用SP ...
最新文章
- 阿里全球数学竞赛第二届
- Java NIO框架Mina
- SolrClient或SolrTemplate写入时连接solr服务器超时问题的一种解决方案
- shell脚本 猜数字游戏并计数比较次数
- Java虚拟机的什么周期
- Arthas排查生产环境CPU飚高问题
- 使用Sqlloader处理数据
- 区块链会议_2018杭州云栖大会区块链相关_20180919
- 羡慕别人表格做的快?6个Excel小技巧+25个Excel快捷键!收藏没错
- 基金交易席位的制度沿袭
- 华为od与中软外包哪个更好_真惨!入职中软一个月(外包华为)就离职了~
- LVGL 8.2图片缩放及旋转
- 淘管家一键铺货怎么弄?和分销下单有什么区别?
- sshd: no hostkeys available — exiting
- windows 命令大全
- 基于微信小程序的高校体育场地预约管理系统
- html前端小教程—各浏览器兼容视频插入方法
- FFT(傅里叶快速变换算法)计算频率
- 阿里java面试复盘 | 三面解说(已通过)
- IT服务公司经理专栏:小公司管理(1)