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

[复制链接]
6425|82
 楼主| 漫天星yl 发表于 2023-7-31 15:28 | 显示全部楼层
当然,要使用该模块之前要记得对其进行初始化哦!初始化函数如下:
  1. /*********************OLED初始化************************************/
  2. void OLED_Init(void)
  3. {
  4.         delay_ms(500);//初始化之前的延时很重要!
  5.         OLED_WrCmd(0xae);//--turn off oled panel
  6.         OLED_WrCmd(0x00);//---set low column address
  7.         OLED_WrCmd(0x10);//---set high column address
  8.         OLED_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  9.         OLED_WrCmd(0x81);//--set contrast control register
  10.         OLED_WrCmd(Brightness); // Set SEG Output Current Brightness
  11.         OLED_WrCmd(0xa1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  12.         OLED_WrCmd(0xc8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  13.         OLED_WrCmd(0xa6);//--set normal display
  14.         OLED_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
  15.         OLED_WrCmd(0x3f);//--1/64 duty
  16.         OLED_WrCmd(0xd3);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
  17.         OLED_WrCmd(0x00);//-not offset
  18.         OLED_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
  19.         OLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
  20.         OLED_WrCmd(0xd9);//--set pre-charge period
  21.         OLED_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock   
  22.         OLED_WrCmd(0xda);//--set com pins hardware configuration
  23.         OLED_WrCmd(0x12);
  24.         OLED_WrCmd(0xdb);//--set vcomh
  25.         OLED_WrCmd(0x40);//Set VCOM Deselect Level
  26.         OLED_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
  27.         OLED_WrCmd(0x02);//
  28.         OLED_WrCmd(0x8d);//--set Charge Pump enable/disable
  29.         OLED_WrCmd(0x14);//--set(0x10) disable
  30.         OLED_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
  31.         OLED_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
  32.         OLED_WrCmd(0xaf);//--turn on oled panel
  33.         OLED_Fill(0x00); //初始清屏
  34.         OLED_Set_Pos(0,0);
  35. }
 楼主| 漫天星yl 发表于 2023-7-31 15:28 | 显示全部楼层
这样,OLED 显示屏就配置好了,我调试过了,亲测可用。
 楼主| 漫天星yl 发表于 2023-7-31 15:28 | 显示全部楼层
2、I2C 驱动 MS5837 压力传感器
由于大创需要,这个传感器可是我找了半天才找到符合需求的模块。也许大家用不到,但其驱动原理与其他模块是一样的。
该模块的驱动与OLED类似,只需要改写下地址位和读写位即可。
  1. unsigned long MS583703BA_getConversion(uint8_t command)
  2. {

  3.                         unsigned long conversion = 0;
  4.                         u8 temp[3];
  5.        
  6.             IIC_Start();
  7.                         IIC_Send_Byte(0xEC);                 //写地址
  8.                         IIC_Wait_Ack();
  9.                         IIC_Send_Byte(command); //写转换命令
  10.                         IIC_Wait_Ack();
  11.                         IIC_Stop();

  12.                         delay_ms(10);
  13.                         IIC_Start();
  14.                         IIC_Send_Byte(0xEC);                 //写地址
  15.                         IIC_Wait_Ack();
  16.                         IIC_Send_Byte(0);                                // start read sequence
  17.                         IIC_Wait_Ack();
  18.                         IIC_Stop();
  19.                  
  20.                         IIC_Start();
  21.                         IIC_Send_Byte(0xEC+0x01);  //进入接收模式
  22.                         IIC_Wait_Ack();
  23.                         temp[0] = IIC_Read_Byte(1);  //带ACK的读数据  bit 23-16
  24.                         temp[1] = IIC_Read_Byte(1);  //带ACK的读数据  bit 8-15
  25.                         temp[2] = IIC_Read_Byte(0);  //带NACK的读数据 bit 0-7
  26.                         IIC_Stop();
  27.                        
  28.                         conversion = (unsigned long)temp[0] * 65536 + (unsigned long)temp[1] * 256 + (unsigned long)temp[2];
  29.                         return conversion;

  30. }
 楼主| 漫天星yl 发表于 2023-7-31 15:29 | 显示全部楼层
关于 I2C 相关内容我就介绍这么多,也许文中有很多表述不清楚,还请大家指出或者联系我,大家一起进步,一起向嵌入式攻城狮迈进!!!
香水城 发表于 2023-8-1 17:02 | 显示全部楼层
辛苦了~!
谢谢楼主!
robertesth 发表于 2023-8-4 13:43 | 显示全部楼层
stm32内部的iic怎么感觉不稳定
mmbs 发表于 2023-8-4 13:55 | 显示全部楼层
在使用STM32进行硬件I2C通信时,需要注意选择合适的I2C总线器件、连接和配置、时序控制以及故障处理等方面
mnynt121 发表于 2023-8-4 14:04 | 显示全部楼层
硬件I2C通信是一种非常有用的通信方式,可以帮助用户实现与I2C总线器件的通信。
wwppd 发表于 2023-8-4 14:45 | 显示全部楼层
根据具体的I2C设备和系统需求,设置正确的7位或10位I2C设备地址。如果需要与多个I2C设备进行通信,确保每个设备具有唯一的地址。
jtracy3 发表于 2023-8-4 15:25 | 显示全部楼层
STM32F302RC 硬件I2C DMa有坑吗
cemaj 发表于 2023-8-4 15:51 | 显示全部楼层
在使用STM32进行硬件I2C通信时,需要注意时序控制。
jimmhu 发表于 2023-8-4 16:42 | 显示全部楼层
请参考芯片的数据手册,确保将SCL和SDA引脚正确连接到外设。
zerorobert 发表于 2023-8-4 17:15 | 显示全部楼层
配置正确的I2C时钟频率。根据传输速率的要求和I2C总线的工作频率范围,选择适当的时钟频率配置。
jkl21 发表于 2023-8-4 17:47 | 显示全部楼层
STM32提供了丰富的错误处理机制,例如错误中断和错误标志位, 可以使用这些机制来检测和处理通信错误。
chenci2013 发表于 2023-8-4 17:57 | 显示全部楼层
STM32支持不同的时钟频率选项,您可以根据需求选择合适的速率。
wwppd 发表于 2023-8-4 18:27 | 显示全部楼层
I2C通信是基于时序的,需要按照一定的时序发送和接收数据。
lzbf 发表于 2023-8-4 19:44 | 显示全部楼层
在使用硬件I2C时,应配置适当的错误处理机制和中断。
louliana 发表于 2023-8-4 21:06 | 显示全部楼层
具体的硬件I2C配置还需参考STM32的数据手册、参考手册和应用笔记
macpherson 发表于 2023-8-4 21:47 | 显示全部楼层
在进行I2C传输时,可以设置适当的超时时间来防止无限等待。
tifmill 发表于 2023-8-4 22:32 | 显示全部楼层
I2C的数据传输是双向的,主机可以通过SDA线发送数据给从机,从机也可以通过SDA线发送数据给主机。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部