本帖最后由 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);
- }
- }
实际输出结果:
|