[技术问答]

M487的I2C硬件收发器用的库函数一直不通

[复制链接]
251|3
手机看帖
扫描二维码
随时随地手机跟帖
jcky001|  楼主 | 2022-9-2 15:33 | 显示全部楼层 |阅读模式
我想用新唐的硬件I2C驱动OLED模块,之前在STM32上做的是可以的。现在换成相同功能的新唐的函数发现失败了,不知道是不是我哪儿没有配置正确。
  • void OLED_Write_cmd(uint8_t cmd)
  • {
  • //        HAL_I2C_Mem_Write(&hi2c2, 0x78, 0x00, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0x100);
  •         while(I2C_WriteByteOneReg(I2C0,OLED_ADDR,0x00,cmd));
  • }
  • void OLED_Write_data(uint8_t data)
  • {
  • //        HAL_I2C_Mem_Write(&hi2c2, 0x78, 0x40, I2C_MEMADD_SIZE_8BIT, &data, 1, 0x100);
  •         while(I2C_WriteByteOneReg(I2C0,OLED_ADDR,0x40,data));
  • }


复制代码

被注释掉的是原来STM32的库函数。下面是对应的新唐的BSP库函数。
初始化中跟I2C0时钟和管脚的配置为

  •     /* Enable I2C0 peripheral clock */
  •     CLK_EnableModuleClock(I2C0_MODULE);
  •     /* Set I2C0 multi-function pins */
  •         SYS->GPG_MFPL = SYS_GPG_MFPL_PG1MFP_I2C0_SDA | SYS_GPG_MFPL_PG0MFP_I2C0_SCL;

复制代码

不知道还要配置什么不,我看的几个例子中基本上也就配置这些。
然后在程序开始设置一下速度
  • void I2C0_Init(void)
  • {
  •     /* Open I2C module and set bus clock */
  •     I2C_Open(I2C0, 100000);
  •     /* Get I2C0 Bus Clock */
  •     printf("I2C clock %d Hz\n", I2C_GetBusClockFreq(I2C0));
  • }

复制代码

不知道为何没法点亮屏幕。GPIO模拟的可以,麻烦版主帮忙试试啊。

使用特权

评论回复
et009| | 2022-9-2 19:19 | 显示全部楼层

OLED_ADDR 要 0x78>>1

使用特权

评论回复
两只袜子| | 2022-9-3 15:00 | 显示全部楼层
uint8_t I2C_WriteByteOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t data)
这个函数的作用是往u8SlaveAddr指定地址的I2C从机的u8DataAddr数据地址里写入一个字节的数据data   
时序为START+u8SlaveAddr+w+ACK+DataAddr+ACK+data+NAK+STOP   
请检查时序是否吻合您的应用。两处ACK的地方如果收到的是NAK会停止发送。
可以debug看一下I2C处理那种状态,我们的I2C所有动作后会有状态指示。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1407

主题

3754

帖子

5

粉丝