你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Nucleo-32F767ZI 硬件和模拟I2C读写

[复制链接]
电子星辰 发布时间:2018-10-28 18:09
本文以Nucleo板做主控电路,通过模拟I2C接收BH1750的数据,然后用Cube配置的硬件I2C发送到OLED上显示出来。

首先用CubeMX搭建工程
1、
硬件I2C选择使用I2C2,
硬件I2C.JPG   

模拟I2C用PB5做SDA、PB6做SCL。
软件I2C.JPG

2、
硬件I2C配置,将速度模式选为Fast Mode,频率选为最高400KHz,其它都可以保持默认。
硬件I2C配置.JPG

模拟I2C是配置GPIO,PB5、6配置是一样的,IO需要配置为开漏输出。除了PB5、6其它的IO不用理会。
软件I2C配置.JPG

然后编写代码
3、oled.c文件
这里硬件I2C,是用HAL_I2C_Mem_Write函数写入I2C。
hi2c2:是你自己使用的具体哪个I2C,一般会自动生成,在i2c.c中的初始定义中可以找到;
OLED_SLAVE_ADDRESS:设备的地址 即oled屏幕的地址,具体看厂家的说明,在给的驱动代码中应该是可以找到的;

OLED_dat_ADDRESS:设备内部地址,可以参考原驱动代码。这个函数这里是写入寄存器;
I2C_MEMADD_SIZE_8BIT:设备内部地址编址方式,根据设备决定是8位编址或者16位编址方式; 这个参数的填写有两种 I2C_MEMADD_SIZE_8BIT I2C_MEMADD_SIZE_16BIT,可以在库代码中找到具体定义;
dat:写入的数据;
1:写入的字节大小;
I2C2_TIMEOUT_MAX:超时时间。
  1. /*
  2. * 函数功能: 通过硬件I2C向OLED写入命令或数据
  3. * 输入参数: dat 数据,cmd 命令
  4. * 返 回 值: 无
  5. * 说    明:无
  6. */
  7. void OLED_WR_Byte(unsigned char dat,unsigned char cmd)
  8. {
  9.         if(cmd) {HAL_I2C_Mem_Write(&hi2c2,OLED_SLAVE_ADDRESS,OLED_dat_ADDRESS,I2C_MEMADD_SIZE_8BIT,&dat,1,I2C2_TIMEOUT_MAX);}
  10.         else                 {HAL_I2C_Mem_Write(&hi2c2,OLED_SLAVE_ADDRESS,OLED_cmd_ADDRESS,I2C_MEMADD_SIZE_8BIT,&dat,1,I2C2_TIMEOUT_MAX);}
  11. }
复制代码
4、i2c.c文件
模拟I2C的代码我是写在i2c.c文件的最后面,具体代码我这里就不贴出来了。
  1. #define I2C_SCL_HIGH() HAL_GPIO_WritePin(I2Cx_SCL_GPIO_Port,I2Cx_SCL_Pin,GPIO_PIN_SET)  // 输出高电平
  2. #define I2C_SCL_LOW()  HAL_GPIO_WritePin(I2Cx_SCL_GPIO_Port,I2Cx_SCL_Pin,GPIO_PIN_RESET)// 输出低电平
  3. #define I2C_SDA_HIGH() HAL_GPIO_WritePin(I2Cx_SDA_GPIO_Port,I2Cx_SDA_Pin,GPIO_PIN_SET)  // 输出高电平
  4. #define I2C_SDA_LOW()  HAL_GPIO_WritePin(I2Cx_SDA_GPIO_Port,I2Cx_SDA_Pin,GPIO_PIN_RESET)// 输出低电平
  5. #define I2C_SDA_READ() HAL_GPIO_ReadPin(I2Cx_SDA_GPIO_Port,I2Cx_SDA_Pin)
复制代码


最后放张实物图
实物图.jpg

I2C_F767ZI_HAL.rar

下载

7.95 MB, 下载次数: 48

收藏 评论3 发布时间:2018-10-28 18:09

举报

3个回答
MrJiu 回答时间:2018-10-29 14:10:36
I2C模拟部分,就给个提示,ST的GPIO是一个变量,然后你会发现有更加好的模拟!!!
电子星辰 回答时间:2018-11-6 13:12:17
MrJiu 发表于 2018-10-29 14:10
I2C模拟部分,就给个提示,ST的GPIO是一个变量,然后你会发现有更加好的模拟!!! ...

能再说一点吗,求教STM32的GPIO是变量,是怎么让I2C模拟更好的呢?
MrJiu 回答时间:2018-11-6 13:54:58
电子星辰 发表于 2018-11-6 13:12
能再说一点吗,求教STM32的GPIO是变量,是怎么让I2C模拟更好的呢?

你想想如果需要多通道I2C,而且任意脚位。。。那么你是不是每次都要搞一套I2C的命名,然后各自宏定义,但是,GPIO是变量,变量是啥意思,就是可以赋值,就可以把GPIO的脚位赋值给变量,那么只需要实现一套I2C,然后切换,或者多通道的时候,只需要赋值不同的GPIO不就可以啦!!!当然了,这还涉及到GPIO控制寄存器,是一样的。。。

评分

参与人数 1ST金币 +10 收起 理由
电子星辰 + 10 多谢指教

查看全部评分

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版