本次实验使用使用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)
|