树莓派python gpio 模仿iic_树莓派-用GPIO虚拟I2C

前言:

非常不幸,树莓派没用多久,I2C接口无法detect。

抱着试一试的心理,到群里问了问,结果被人喷曰:“现在钱多人傻的人真多,什么都不懂,还玩树莓派”。

我心想,难道树莓派真的很“高大上”?

事情是这样:

前些天树莓派接到6wd机器人扩展板上玩了几天,接着上摄像头,摄像头工作。

但是没多久,可能是供电不足的缘故,树莓派WiFi突然不通,重启几次板子仍然没有解决。

后知后觉的我将树莓派插入电脑USB3.0口,WiFi恢复。

第二天试I2C,却I2C无法detect,犹如晴天霹雳,令人措不及防,修改参数,重装系统...

因为自己不是做硬件的,没设备进行调试,I2C坏掉的原因一直没有查出。

在这里,如果有幸遇上有缘人,能帮忙指导指导,还不吝赐教,万分感激!!!

(请勿见怪,不知什么原因,截的图无法上传,直接用了商家的图,如有不妥之处,请@)

废话少说,奉上解决办法:

因为也是刚刚拿到板子,对树莓派的了解知之甚少,摸索了大约两天。

后来找到Device Trees,发现里面的dtoverlay非常强大。

曙光出现在Changing i2c sda1 scl1 pin这篇文章,文章告诉我树莓派可以通过设置dtoverlay虚拟多个I2C接口。

抱着死马当作活马医的态度,按照文章,我修改dtoverlay,将其设置为i2c-gpio,bus=3,i2c_gpio_delay_us=2,i2c_gpio_sda=5,i2c_gpio_scl=6。

运行i2cdetect -l,出现了i2c-3设备:

root@raspberrypi:/home/pi# i2cdetect -l

i2c-3 i2c i2c@3 I2C adapter

i2c-1 i2c bcm2835 I2C adapter I2C adapter

运行i2cdetect -y 3,找到6wd:

root@raspberrypi:/home/pi# i2cdetect -y 3

0 1 2 3 4 5 6 7 8 9 a b c d e f

00: -- -- -- -- -- -- -- -- -- -- -- -- --

10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

40: -- 41 -- -- -- -- -- -- -- -- -- -- -- -- -- --

50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

70: 70 -- -- -- -- -- -- --

再修改6wd控制脚本的I2C bus,并运行,完美解决!

修改后的/boot/config.txt如下:

# Uncomment some or all of these to enable the optional hardware interfaces

dtparam=i2c_arm=on

#dtparam=i2s=on

dtparam=spi=on

dtoverlay=i2c-gpio,bus=3,i2c_gpio_delay_us=2,i2c_gpio_sda=5,i2c_gpio_scl=6

备注:

其中i2c_gpio_sda=5和i2c_gpio_scl=6分别指pin 29和pin 31。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是STM32单片机中I2C总线的初始化函数,主要包含以下几个步骤: 1. 配置I2C总线的GPIO引脚: ``` GPIO_InitStructure.GPIO_Pin = IIC_SCL_PIN | IIC_SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(IIC_SCL_PORT, &GPIO_InitStructure); ``` 这里使用GPIO_Mode_AF_OD模式,表示这两个引脚是复用推挽输出模式,以便于与I2C总线进行通讯。同时,也开启了GPIOB总线时钟,使得GPIOB端口能够正常工作。 2. 配置I2C总线的时钟、模式、地址等参数: ``` I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x00; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; I2C_Init(I2C1, &I2C_InitStructure); ``` 这里使用I2C_Mode_I2C模式,表示I2C总线是标准I2C模式。I2C_DutyCycle_2表示时钟周期的占空比为2。I2C_OwnAddress1表示自身的I2C地址,在本例中设为0x00。I2C_Ack_Enable表示使能应答信号,I2C_AcknowledgedAddress_7bit表示I2C总线的寻址模式为7位地址模式。I2C_ClockSpeed表示I2C总线的通信速率为100kHz。以上参数的具体含义可以参考STM32官方文档。 3. 使能I2C总线: ``` I2C_Cmd(I2C1, ENABLE); ``` 这里使用I2C_Cmd函数使能I2C总线,以便于进行I2C通讯。 综上,这段代码主要是用来初始化I2C总线并使能,以便于后续进行I2C通讯。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值