《树莓派CM3》I2C引脚映射到GPIO28/29

本文介绍了一种在树莓派CM3上通过CMIO扩展GPIO至GPIO45的方法,解决了因DPI占用GPIO0-GPIO27导致的接口不足问题。详细讲解了如何修改bcm2835库,将I2C引脚重新映射到GPIO28和GPIO29,以连接DS3231时钟芯片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前网上树莓派很少针对CM3的资料,手上有一项目,因为使用DPI占用了GPIO0-GPIO27,也就是说树莓派3B的板子上J8的IO全部用掉了,另外项目还要接OLED,DS3231时钟芯片等其他外设,所以不能使用树莓派3B,还好树莓派提供工业计算模块CM3,从微雪资料上看GPIO至少扩展到GPIO45,所以就先选用了CM3Lite+微雪的CMIO+内存卡等其他配件,CM3lite是不带eMMC的版本,我是感觉研究期间还是内存卡方便,更贴近pi-3B。
因为微雪CMIO上面的DS3231的I2C引脚连接到默认的GPIO2(SDA1)、GPIO3(SCL1),提供的例程 http://www.waveshare.net/wiki/Compute_Module_IO_Board_Plus 也是针对这个引脚,所以需要对程序进行修改,其中Python、wiringPi的库、驱动不太熟悉,所以决定从BCM2835例程修改。树莓派3B、CM3的CPU是BCM2837,但是最详细的CPU资料只有BCM2835的PDF,大概看了一下,里面基本以bcm283x描述,可以预判bcm2837和bcm2835的寄存器应该没有太多的变化,于是便研究bcm2835 C library http://www.airspayce.com/mikem/bcm2835/ ,我下载版本是1.58。下载后解压,目录下面主要看src文件夹下的bcm2835.c和bcm2835.h。
在这里插入图片描述
打开微雪DS3231的bcm2835例程ds3231.c和bcm2835库的bcm2835.c、bcm2835.h,找到对应I2C有关的代码,如下图:
在这里插入图片描述
在bcm2835.c中找到了bcm2835_i2c_begin(void)函数,其中红色框是使用SDA0(GPIO0)和SCL0(GPIO1)两个引脚,绿框是默认的(源码#define I2C_V1是被注释掉的),SDA1(GPIO2)和SCL1(GPIO3),对应看bcm2835.h第797行定义,有个RPiGPIOPin的枚举类型。
在这里插入图片描述
可以看出就是没定义GPIO28(SDA0)和GPIO29(SCL0),所以直接把#ifdef I2C_V1到#endif 这段引脚分配改成:

volatile uint32_t* paddr = bcm2835_bsc0 + BCM2835_BSC_DIV/4;
/* Set the I2C/BSC0 pins to the Alt 0 function to enable I2C access on them */
 bcm2835_gpio_fsel(28, BCM2835_GPIO_FSEL_ALT0); /* SDA */
 bcm2835_gpio_fsel(29, BCM2835_GPIO_FSEL_ALT0); /* SCL */

之后把bcm2835.c中其他有#ifdef I2C_V1的地方对应修改掉,总之只留bcm2835_bsc0部分,GPIO改成对应的28,29。
改好之后保存,按照下图重新编译安装到树莓派:
http://www.airspayce.com/mikem/bcm2835/
然后编译微雪ds3231.c,即cd到对应文件夹,再 gcc -Wall ds3231.c -o ds3231 -lbcm2835,生成ds3231可执行文件,然后sudo ./ds3231回车,就看到了终端开始打印出时间日期,1s更新一次。

注意:

  • 执行ds3231时一定要加sudo!
  • GPIO28,GPIO29做I2C引脚需要加上拉电阻。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值