打印
[活动专区]

【AT-START-F425测评】2、I2C(OLED)

[复制链接]
649|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
      本次实验使用使用I2C1(PB6、PB7)驱动1.3寸单色OLED。

一、知识准备
      AT32F425R8T7T片上集成了两组I2C接口并同时支持2个支持SMBus/PMBus,速度上更是支持100kHz的标准模式、400kHz的快速模式以及1MHz的增强快速模式。



手册上对I2C通信的各个技术节点描述的非常详尽,这对于I2C协议的学习与理解具有很强大的指导意义。下面是手册中对于I2C通信时序的描述:






二、程序实现
      实验程序以官方例程为基础修改而成,OLED的驱动部分取自于“中景园”参考例程。
static void i2c_config(void)//I2C端口配置
{
        gpio_init_type gpio_init_structure;

        crm_periph_clock_enable(CRM_I2C1_PERIPH_CLOCK, TRUE);   
        crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);

        i2c_reset(I2C1);

        gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE6, GPIO_MUX_1);//SCL(PB6)
        gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE7, GPIO_MUX_1);//SDA(PB7)

        gpio_init_structure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
        gpio_init_structure.gpio_mode           = GPIO_MODE_MUX;
        gpio_init_structure.gpio_out_type       = GPIO_OUTPUT_OPEN_DRAIN;
        gpio_init_structure.gpio_pull           = GPIO_PULL_UP;                                             

        gpio_init_structure.gpio_pins           = GPIO_PINS_6|GPIO_PINS_7;
        gpio_init(GPIOB, &gpio_init_structure);

        i2c_init(I2C1, 0, I2Cx_CLKCTRL);
        i2c_own_address1_set(I2C1, I2C_ADDRESS_MODE_7BIT, OLED_I2C_ADDR);
        i2c_enable(I2C1, TRUE);
}
/**
  * @函数名: Write_OELD_Command
  * @功  能: 对OLED写入命令
  * @参  数: I2C_Command:写入的命令字节
  * @返回值: 无
  */
static void Write_OLED_Command(uint8_t I2C_Command)
{
  while(i2c_flag_get(I2C1, I2C_BUSYF_FLAG));        //等待I2C总线空闲

  i2c_transmit_set( I2C1, //
                                                                                OLED_I2C_ADDR,                                         //从机(OLED)器件地址
                                                                                2,                                                                                         //发送数据个数
                                                                                I2C_AUTO_STOP_MODE,                 //自动发送停止条件
                                                                                I2C_GEN_START_WRITE);                //发送数据并生成启动
       
  while(!i2c_flag_get(I2C1, I2C_TDIS_FLAG));
  i2c_data_send(I2C1, 0x00);
  while(!i2c_flag_get(I2C1, I2C_TDIS_FLAG));
  i2c_data_send(I2C1, I2C_Command);
  while(!i2c_flag_get(I2C1, I2C_STOPF_FLAG));
  i2c_flag_clear(I2C1, I2C_STOPF_FLAG);
}
/**
  * @函数名: Write_OELD_Data
  * @功  能: 对OLED写入数据
  * @参  数: I2C_Data:写入的数据字节
  * @返回值: 无
  */
static void Write_OLED_Data(uint8_t I2C_Data)
{
  while(i2c_flag_get(I2C1, I2C_BUSYF_FLAG));        //等待I2C总线空闲
  i2c_transmit_set(I2C1, OLED_I2C_ADDR, 2, I2C_AUTO_STOP_MODE, I2C_GEN_START_WRITE);
  while(!i2c_flag_get(I2C1, I2C_TDIS_FLAG));
  i2c_data_send(I2C1, 0x40);
  while(!i2c_flag_get(I2C1, I2C_TDIS_FLAG));
  i2c_data_send(I2C1, I2C_Data);
  while(!i2c_flag_get(I2C1, I2C_STOPF_FLAG));        //停车
  i2c_flag_clear(I2C1, I2C_STOPF_FLAG);                                //清除停车标志位
}
上面是I2C配置及“写”函数,没有涉及到“读”数据,比较简单。

三、实验结果





OLED_HW_I2C.rar (310.47 KB)

使用特权

评论回复
沙发
七毛钱| | 2022-3-15 15:48 | 只看该作者
感谢分享,

使用特权

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

本版积分规则

99

主题

14979

帖子

17

粉丝