本帖最后由 meiyaolei 于 2024-12-31 23:03 编辑
OLED引脚说明
GND:电源地,连接电源负极。
VCC:电源正极,提供2.2V~5.5V的电压。
SCL(D0):时钟引脚,用于I²C通信的时钟信号。
SDA(D1):数据引脚,用于I²C通信的数据信号。
在AT32的初始化代码中,需要配置I²C的时钟频率、地址等参数。
在配置好参数后,需要初始化I²C硬件,使其进入工作状态。
根据OLED屏幕的通信协议,编写I²C通信代码,包括发送命令、发送数据等操作。
在编写好代码后,需要进行调试和测试,确保I²C通信能够正常工作,并且OLED屏幕能够正确显示内容。
I2C框图:
时序:
I2C 内核由I2C_CLK 提供时钟,I2C_CLK 由PCLK1 提供,PCLK1 周期需满足小于4/3 SCL 周期。
通过I2C_CLKCTRL 寄存器的各个位,配置各个时序。
— DIV[7: 0]: I2C时钟分频;
— SDAD[3: 0]:数据保持时间( tHD;DAT) ;
— SCLD[3:0]:数据建立时间( tSU;DAT) ;
— SCLH[7:0]:SCL高电平时间;
— SCLL[7: 0]:SCL低电平时间。
软件部分:
该部分是硬件IIC的驱动宏定义部分:
#define I2Cx_ADDRESS 0xA0
#define I2Cx_PORT I2C1
#define I2Cx_CLK CRM_I2C1_PERIPH_CLOCK
#define I2Cx_DMA DMA1
#define I2Cx_DMA_CLK CRM_DMA1_PERIPH_CLOCK
#define I2Cx_SCL_GPIO_CLK CRM_GPIOB_PERIPH_CLOCK
#define I2Cx_SCL_GPIO_PIN GPIO_PINS_6
#define I2Cx_SCL_GPIO_PinsSource GPIO_PINS_SOURCE6
#define I2Cx_SCL_GPIO_PORT GPIOB
#define I2Cx_SCL_GPIO_MUX GPIO_MUX_1
#define I2Cx_SDA_GPIO_CLK CRM_GPIOB_PERIPH_CLOCK
#define I2Cx_SDA_GPIO_PIN GPIO_PINS_7
#define I2Cx_SDA_GPIO_PinsSource GPIO_PINS_SOURCE7
#define I2Cx_SDA_GPIO_PORT GPIOB
#define I2Cx_SDA_GPIO_MUX GPIO_MUX_1
硬件IIC驱动部分:
void i2c_lowlevel_init(i2c_handle_type* hi2c)
{
gpio_init_type gpio_init_structure;
if(hi2c->i2cx == I2Cx_PORT)
{
/* i2c periph clock enable */
crm_periph_clock_enable(I2Cx_CLK, TRUE);
crm_periph_clock_enable(I2Cx_SCL_GPIO_CLK, TRUE);
crm_periph_clock_enable(I2Cx_SDA_GPIO_CLK, TRUE);
/* gpio configuration */
gpio_pin_mux_config(I2Cx_SCL_GPIO_PORT, I2Cx_SCL_GPIO_PinsSource, I2Cx_SCL_GPIO_MUX);
gpio_pin_mux_config(I2Cx_SDA_GPIO_PORT, I2Cx_SDA_GPIO_PinsSource, I2Cx_SDA_GPIO_MUX);
/* configure i2c pins: scl */
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_NONE;
gpio_init_structure.gpio_pins = I2Cx_SCL_GPIO_PIN;
gpio_init(I2Cx_SCL_GPIO_PORT, &gpio_init_structure);
/* configure i2c pins: sda */
gpio_init_structure.gpio_pins = I2Cx_SDA_GPIO_PIN;
gpio_init(I2Cx_SDA_GPIO_PORT, &gpio_init_structure);
/* config i2c */
i2c_init(hi2c->i2cx, 0x0F, I2Cx_CLKCTRL);
i2c_own_address1_set(hi2c->i2cx, I2C_ADDRESS_MODE_7BIT, I2Cx_ADDRESS);
}
}
实际输出结果:
|