下面是GD32E230C8T6使用I2C外设进行I2C写操作的示例代码:

#include "gd32e23x.h"

#define I2C_SCL_PIN     GPIO_PIN_6      // I2C时钟线引脚
#define I2C_SDA_PIN     GPIO_PIN_7      // I2C数据线引脚
#define I2C_GPIO_PORT   GPIOB           // I2C引脚所在的GPIO端口
#define I2C_GPIO_CLK    RCU_GPIOB       // I2C引脚所在GPIO端口的时钟
#define I2C_SPEED       100000          // I2C通信速率

#define I2C_WRITE_ADDR  0xA0            // I2C写地址
#define I2C_DATA_LEN    2               // 要写入的数据长度

uint8_t i2c_data[I2C_DATA_LEN] = {0x01, 0x02};    // 要写入的数据

void i2c_gpio_config(void)
{
    rcu_periph_clock_enable(I2C_GPIO_CLK);

    gpio_init(I2C_GPIO_PORT, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, I2C_SCL_PIN | I2C_SDA_PIN);
    gpio_pin_remap_config(GPIO_I2C1_REMAP, ENABLE);
}

void i2c_config(void)
{
    rcu_periph_clock_enable(RCU_I2C1);

    i2c_init(I2C1);
    i2c_clock_config(I2C1, I2C_SPEED, I2C_DTCY_2);
    i2c_mode_addr_config(I2C1, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C_WRITE_ADDR);
    i2c_ack_config(I2C1, I2C_ACK_ENABLE);
    i2c_enable(I2C1);
}

void i2c_write_data(void)
{
    uint8_t i;

    i2c_start_on_bus(I2C1, I2C_I2C0ST_SND_WR);
    i2c_flag_clear(I2C1, I2C_FLAG_SBSEND);

    i2c_send_data(I2C1, i2c_data[0]);
    while(!i2c_flag_get(I2C1, I2C_FLAG_TBE));

    i2c_send_data(I2C1, i2c_data[1]);
    while(!i2c_flag_get(I2C1, I2C_FLAG_TBE));

    i2c_stop_on_bus(I2C1);
    delay_ms(10);   // 等待总线上的其他设备响应
}

int main(void)
{
    i2c_gpio_config();
    i2c_config();

    while(1)
    {
        i2c_write_data();
        delay_ms(1000);
    }

    return 0;
}

该代码中,首先进行了GPIO和I2C外设的初始化配置,然后在主函数中不断地进行I2C写操作。

在i2c_write_data()函数中,首先发送起始信号,并等待起始信号发送完成;然后发送要写入的数据,并等待数据发送完成;最后发送停止信号,等待总线上的其他设备响应。需要注意的是,在发送完数据后要等待一定时间,以便其他设备有足够的时间响应。

GD32E230C8T6时I2C外设I2C写代码

原文地址: https://www.cveoy.top/t/topic/bUKk 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录