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

目前网上树莓派很少针对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。
《树莓派CM3》I2C引脚映射到GPIO28/29_第1张图片
打开微雪DS3231的bcm2835例程ds3231.c和bcm2835库的bcm2835.c、bcm2835.h,找到对应I2C有关的代码,如下图:
《树莓派CM3》I2C引脚映射到GPIO28/29_第2张图片
在bcm2835.c中找到了bcm2835_i2c_begin(void)函数,其中红色框是使用SDA0(GPIO0)和SCL0(GPIO1)两个引脚,绿框是默认的(源码#define I2C_V1是被注释掉的),SDA1(GPIO2)和SCL1(GPIO3),对应看bcm2835.h第797行定义,有个RPiGPIOPin的枚举类型。
《树莓派CM3》I2C引脚映射到GPIO28/29_第3张图片
可以看出就是没定义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。
改好之后保存,按照下图重新编译安装到树莓派:
《树莓派CM3》I2C引脚映射到GPIO28/29_第4张图片
然后编译微雪ds3231.c,即cd到对应文件夹,再 gcc -Wall ds3231.c -o ds3231 -lbcm2835,生成ds3231可执行文件,然后sudo ./ds3231回车,就看到了终端开始打印出时间日期,1s更新一次。

注意:

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

你可能感兴趣的:(树莓派)