[国产单片机] 【东软载波ES32F369x+驱动0.96OLED】

[复制链接]
 楼主| freeelectron 发表于 2021-1-23 17:28 | 显示全部楼层 |阅读模式
本帖最后由 freeelectron 于 2021-1-23 17:32 编辑

1、硬件连接使用IIC接口驱动

同时需要上拉电阻4.7k。

2、IO口

SCL和SDA使用使用PB10和PB11,因此配置成复用功能5;

  1. void i2c_pin_init(void)
  2. {
  3.         md_gpio_init_t x;

  4.         /* Initialize scl pin */
  5.         x.mode  = MD_GPIO_MODE_OUTPUT;
  6.         x.odos  = MD_GPIO_OPEN_DRAIN;
  7.         x.pupd  = MD_GPIO_PUSH_UP;
  8.         x.nodrv = MD_GPIO_OUT_DRIVE_1;
  9.         x.flt   = MD_GPIO_FILTER_DISABLE;
  10.         x.type  = MD_GPIO_TYPE_TTL;
  11.         x.func  = MD_GPIO_FUNC_5;
  12.         md_gpio_init(GPIOB, MD_GPIO_PIN_10, &x);

  13.         /* Initialize sda pin */
  14.         x.mode  = MD_GPIO_MODE_OUTPUT;
  15.         x.odos  = MD_GPIO_OPEN_DRAIN;
  16.         x.pupd  = MD_GPIO_PUSH_UP;
  17.         x.nodrv = MD_GPIO_OUT_DRIVE_1;
  18.         x.flt   = MD_GPIO_FILTER_DISABLE;
  19.         x.type  = MD_GPIO_TYPE_TTL;
  20.         x.func  = MD_GPIO_FUNC_5;
  21.         md_gpio_init(GPIOB, MD_GPIO_PIN_11, &x);

  22.         return;
  23. }
复制代码


3、I2C外设配置
md_i2c_struct_init(&init);用于获取md_i2c_init_t结构体的值,也可以自己配置,库函数里面有个默认配置md_i2c_init(I2C1, &init);初始化I2C
md_i2c_set_addr_0_9_bit:用于设置从机地址,从机地址是0x78   
md_i2c_set_transmit_length(I2C1,2); 设置发送的数据长度为2byte;
md_i2c_enable_auto_end(I2C1); 用于配置自动产生stop信号。
  1. void I2C_PeriphInit(void)
  2. {
  3.         md_i2c_init_t init;

  4.         memset(&init, 0, sizeof(md_i2c_init_t));
  5.         md_i2c_struct_init(&init);
  6.         md_i2c_init(I2C1, &init);
  7.         
  8.         md_i2c_set_transmit_fifo_reset(I2C1);
  9.         
  10.         md_i2c_set_transmit_length(I2C1,2);
  11.         md_i2c_set_addr_0_9_bit(I2C1, OLED_ADDRESS);
  12.         md_i2c_enable_auto_end(I2C1);

  13.         md_i2c_enable_master_write(I2C1);
  14. }
复制代码
4、I2C写数据
  1. void I2C_WriteByte(uint8_t addr,uint8_t data)
  2. {        
  3.   md_i2c_set_start(I2C1);  //START信号,启用会,会自动发送从机地址
  4.                                 
  5.         md_i2c_set_tx_reg_data(I2C1, addr);
  6.                
  7. <b>        while(!md_i2c_is_active_txe(I2C1 ));  //特别重要,用于判断fifo为空。
  8. </b>
  9.         md_i2c_set_tx_reg_data(I2C1, data);

  10. }
复制代码

用逻辑分析仪抓取波形,速度基本与配置的一样,100k,。

5、OLED写数据和命令

这里都是通用的,关于详细的原理可以参考:OLED驱动原理
  1. void WriteCmd(uint8_t I2C_Command)//写命令
  2. {
  3.   I2C_WriteByte(0x00, I2C_Command);
  4. }

  5. void WriteDat(uint8_t I2C_Data)//写数据
  6. {
  7.   I2C_WriteByte(0x40, I2C_Data);
  8. }
复制代码

6、OLED显示

字库取模方式:共阴、列行式、逆向输出。


最后说一点,es32f369x的硬件i2c驱动方式与stm32有很大区别。

篇幅有限,附上完整代码:





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:stm32/LoRa物联网:304350312

65

主题

785

帖子

11

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