[技术问答]

呼叫牛版主,M487的I2C硬件收发器用的库函数一直不通

[复制链接]
379|4
手机看帖
扫描二维码
随时随地手机跟帖
gaoyang9992006|  楼主 | 2022-8-31 09:19 | 显示全部楼层 |阅读模式
我想用新唐的硬件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;
不知道还要配置什么不,我看的几个例子中基本上也就配置这些。

使用特权

评论回复
gaoyang9992006|  楼主 | 2022-8-31 09:22 | 显示全部楼层
IO模拟的是可以正常用的。不知道硬件的该如何做,我在网上没有查到有人用新唐的M4系列的I2C硬件收发器驱动OLED模块,都是用的GPIO,好奇怪,所以大胆的提个问啊。

使用特权

评论回复
et009| | 2022-9-1 17:41 | 显示全部楼层
1. /* Open I2C module and set bus clock */
    I2C_Open(I2C0, 400000);
2. OLED_ADDR 要 0x78>>1

試試看

使用特权

评论回复
gaoyang9992006|  楼主 | 2022-9-6 20:17 | 显示全部楼层

使用特权

评论回复
gaoyang9992006|  楼主 | 2022-9-6 20:21 | 显示全部楼层
et009 发表于 2022-9-1 17:41
1. /* Open I2C module and set bus clock */
    I2C_Open(I2C0, 400000);
2. OLED_ADDR 要 0x78>>1

是的,你这个是对的。已经解决,找到了问题的根源,知道了STM32的库函数和新塘的库函数的区别,他们对于底层地址的处理方式不同,而卖模块的提供的是左移1位后对应的八位地址,不是原始的7位,所以这里搞偏差了。不过在发现问题的过程中学到了很多东西。感谢回复。

使用特权

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

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1893

主题

15621

帖子

197

粉丝