打印
[STM32F4]

STM32F407 —— 硬件 I2C 驱动的步骤与应用

[复制链接]
楼主: 漫天星yl
手机看帖
扫描二维码
随时随地手机跟帖
21
漫天星yl|  楼主 | 2023-7-31 15:28 | 只看该作者 回帖奖励 |倒序浏览
当然,要使用该模块之前要记得对其进行初始化哦!初始化函数如下:
/*********************OLED初始化************************************/
void OLED_Init(void)
{
        delay_ms(500);//初始化之前的延时很重要!
        OLED_WrCmd(0xae);//--turn off oled panel
        OLED_WrCmd(0x00);//---set low column address
        OLED_WrCmd(0x10);//---set high column address
        OLED_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
        OLED_WrCmd(0x81);//--set contrast control register
        OLED_WrCmd(Brightness); // Set SEG Output Current Brightness
        OLED_WrCmd(0xa1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
        OLED_WrCmd(0xc8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
        OLED_WrCmd(0xa6);//--set normal display
        OLED_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
        OLED_WrCmd(0x3f);//--1/64 duty
        OLED_WrCmd(0xd3);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
        OLED_WrCmd(0x00);//-not offset
        OLED_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
        OLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
        OLED_WrCmd(0xd9);//--set pre-charge period
        OLED_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock   
        OLED_WrCmd(0xda);//--set com pins hardware configuration
        OLED_WrCmd(0x12);
        OLED_WrCmd(0xdb);//--set vcomh
        OLED_WrCmd(0x40);//Set VCOM Deselect Level
        OLED_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
        OLED_WrCmd(0x02);//
        OLED_WrCmd(0x8d);//--set Charge Pump enable/disable
        OLED_WrCmd(0x14);//--set(0x10) disable
        OLED_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
        OLED_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
        OLED_WrCmd(0xaf);//--turn on oled panel
        OLED_Fill(0x00); //初始清屏
        OLED_Set_Pos(0,0);
}

使用特权

评论回复
22
漫天星yl|  楼主 | 2023-7-31 15:28 | 只看该作者
这样,OLED 显示屏就配置好了,我调试过了,亲测可用。

使用特权

评论回复
23
漫天星yl|  楼主 | 2023-7-31 15:28 | 只看该作者
2、I2C 驱动 MS5837 压力传感器
由于大创需要,这个传感器可是我找了半天才找到符合需求的模块。也许大家用不到,但其驱动原理与其他模块是一样的。
该模块的驱动与OLED类似,只需要改写下地址位和读写位即可。
unsigned long MS583703BA_getConversion(uint8_t command)
{

                        unsigned long conversion = 0;
                        u8 temp[3];
       
            IIC_Start();
                        IIC_Send_Byte(0xEC);                 //写地址
                        IIC_Wait_Ack();
                        IIC_Send_Byte(command); //写转换命令
                        IIC_Wait_Ack();
                        IIC_Stop();

                        delay_ms(10);
                        IIC_Start();
                        IIC_Send_Byte(0xEC);                 //写地址
                        IIC_Wait_Ack();
                        IIC_Send_Byte(0);                                // start read sequence
                        IIC_Wait_Ack();
                        IIC_Stop();
                 
                        IIC_Start();
                        IIC_Send_Byte(0xEC+0x01);  //进入接收模式
                        IIC_Wait_Ack();
                        temp[0] = IIC_Read_Byte(1);  //带ACK的读数据  bit 23-16
                        temp[1] = IIC_Read_Byte(1);  //带ACK的读数据  bit 8-15
                        temp[2] = IIC_Read_Byte(0);  //带NACK的读数据 bit 0-7
                        IIC_Stop();
                       
                        conversion = (unsigned long)temp[0] * 65536 + (unsigned long)temp[1] * 256 + (unsigned long)temp[2];
                        return conversion;

}

使用特权

评论回复
24
漫天星yl|  楼主 | 2023-7-31 15:29 | 只看该作者
关于 I2C 相关内容我就介绍这么多,也许文中有很多表述不清楚,还请大家指出或者联系我,大家一起进步,一起向嵌入式攻城狮迈进!!!

使用特权

评论回复
25
香水城| | 2023-8-1 17:02 | 只看该作者
辛苦了~!
谢谢楼主!

使用特权

评论回复
26
robertesth| | 2023-8-4 13:43 | 只看该作者
stm32内部的iic怎么感觉不稳定

使用特权

评论回复
27
mmbs| | 2023-8-4 13:55 | 只看该作者
在使用STM32进行硬件I2C通信时,需要注意选择合适的I2C总线器件、连接和配置、时序控制以及故障处理等方面

使用特权

评论回复
28
mnynt121| | 2023-8-4 14:04 | 只看该作者
硬件I2C通信是一种非常有用的通信方式,可以帮助用户实现与I2C总线器件的通信。

使用特权

评论回复
29
wwppd| | 2023-8-4 14:45 | 只看该作者
根据具体的I2C设备和系统需求,设置正确的7位或10位I2C设备地址。如果需要与多个I2C设备进行通信,确保每个设备具有唯一的地址。

使用特权

评论回复
30
jtracy3| | 2023-8-4 15:25 | 只看该作者
STM32F302RC 硬件I2C DMa有坑吗

使用特权

评论回复
31
cemaj| | 2023-8-4 15:51 | 只看该作者
在使用STM32进行硬件I2C通信时,需要注意时序控制。

使用特权

评论回复
32
jimmhu| | 2023-8-4 16:42 | 只看该作者
请参考芯片的数据手册,确保将SCL和SDA引脚正确连接到外设。

使用特权

评论回复
33
zerorobert| | 2023-8-4 17:15 | 只看该作者
配置正确的I2C时钟频率。根据传输速率的要求和I2C总线的工作频率范围,选择适当的时钟频率配置。

使用特权

评论回复
34
jkl21| | 2023-8-4 17:47 | 只看该作者
STM32提供了丰富的错误处理机制,例如错误中断和错误标志位, 可以使用这些机制来检测和处理通信错误。

使用特权

评论回复
35
chenci2013| | 2023-8-4 17:57 | 只看该作者
STM32支持不同的时钟频率选项,您可以根据需求选择合适的速率。

使用特权

评论回复
36
wwppd| | 2023-8-4 18:27 | 只看该作者
I2C通信是基于时序的,需要按照一定的时序发送和接收数据。

使用特权

评论回复
37
lzbf| | 2023-8-4 19:44 | 只看该作者
在使用硬件I2C时,应配置适当的错误处理机制和中断。

使用特权

评论回复
38
louliana| | 2023-8-4 21:06 | 只看该作者
具体的硬件I2C配置还需参考STM32的数据手册、参考手册和应用笔记

使用特权

评论回复
39
macpherson| | 2023-8-4 21:47 | 只看该作者
在进行I2C传输时,可以设置适当的超时时间来防止无限等待。

使用特权

评论回复
40
tifmill| | 2023-8-4 22:32 | 只看该作者
I2C的数据传输是双向的,主机可以通过SDA线发送数据给从机,从机也可以通过SDA线发送数据给主机。

使用特权

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

本版积分规则