【体验目的】点亮OLED屏,学习使用I2C外设
【实验器材】
  • MIN-F5333开发板
  • OLED显示屏
【实现步骤】
  • 复制原来的模版工程,重命名为MM32F5330_OLED
121442epmkz8t84xxpet5t
2、打开工程清理不需要的模块驱动:
121442gi0qa2ls8biyzji2
3、新建OLED文件夹,拷贝一份其它工程中使用的OLED驱动到工程,工程中新建OLED分组,并把OLED.c添回进分组,同时把头文件包含到工程中:
121442un9nitott1rzr9e3
121445jyzehh48tb45e0e8
3、添加进来后,首先把main.h加入到字库以及头文件中。在oled.c中引入hal_i2c.h头文件。
4、添加i2c初始化函数:
  1. void I2C_Configure(void)

  2. {

  3. GPIO_InitTypeDef GPIO_InitStruct;

  4. I2C_InitTypeDef I2C_InitStruct;

  5. RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);

  6. I2C_DeInit(I2C2);

  7. I2C_StructInit(&I2C_InitStruct);

  8. I2C_InitStruct.I2C_Mode = I2C_MODE_MASTER;

  9. I2C_InitStruct.I2C_OwnAddress = I2C_OWN_ADDRESS;

  10. I2C_InitStruct.I2C_ClockSpeed = 400000;

  11. I2C_Init(I2C2, &I2C_InitStruct);

  12. I2C_TargetAddressConfig(I2C2, OLED_I2C_ADDRESS);

  13. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

  14. GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_4);

  15. GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_4);

  16. GPIO_StructInit(&GPIO_InitStruct);

  17. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;

  18. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;

  19. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD;

  20. GPIO_Init(GPIOC, &GPIO_InitStruct);

  21. I2C_Cmd(I2C2, ENABLE);

  22. }

5、修改写入命令与数据命令:
  1. /**************************************************************
  2.          Prototype      : void WriteCmd(uint8_t IIC_Command)
  3.          Parameters     : IIC_Command
  4.          return                                        : none
  5.          Description    : 写命令
  6. ***************************************************************/
  7. void WriteCmd(uint8_t IIC_Command)
  8. {
  9.         uint8_t dat;
  10.         dat = IIC_Command;
  11.         I2C_SendData(I2C2, 0x00);

  12.         while (RESET == I2C_GetFlagStatus(I2C2, I2C_STATUS_FLAG_TFE))
  13.         {
  14.         }
  15.        
  16.         I2C_SendData(I2C2, dat);

  17.         while (RESET == I2C_GetFlagStatus(I2C2, I2C_STATUS_FLAG_TFE))
  18.         {
  19.         }
  20.         I2C_GenerateSTOP(I2C2, ENABLE);

  21.         while (RESET == I2C_GetFlagStatus(I2C2, I2C_STATUS_FLAG_TFE))
  22.         {
  23.         }
  24. }

  25. /**************************************************************
  26.          Prototype      : void WriteDat(uint8_t IIC_Data)
  27.          Parameters     : IIC_Data
  28.          return                                        : none
  29.          Description    : 写数据
  30. ***************************************************************/
  31. void WriteDat(uint8_t IIC_Data)
  32. {

  33.         uint8_t dat;
  34.         dat = IIC_Data;
  35.         I2C_SendData(I2C2, 0x40);

  36.         while (RESET == I2C_GetFlagStatus(I2C2, I2C_STATUS_FLAG_TFE))
  37.         {
  38.         }
  39.        
  40.         I2C_SendData(I2C2, dat);

  41.         while (RESET == I2C_GetFlagStatus(I2C2, I2C_STATUS_FLAG_TFE))
  42.         {
  43.         }
  44.         I2C_GenerateSTOP(I2C2, ENABLE);

  45.         while (RESET == I2C_GetFlagStatus(I2C2, I2C_STATUS_FLAG_TFE))
  46.         {
  47.         }
  48. }

这样就修改好了写命令与写数据
6、在main.c中写入测试函数,下达到开发板就可以成功的驱动OLED屏了。
121445jy3zjmm4pdm3lvdy
【总结】
这次我测试的摸拟的i2c最高只能达到45Khz,但是使用硬件i2c,配置为400K的速度,可以达到350K的速度,单刷一屏的速度非的快。
121445nda4m11n41rruar2
附驱动代码,需要的自取:
MM32F5330_OLED.zip (433.52 KB, 下载次数: 4)
全部回复 0
暂无评论,快来抢沙发吧