[AT32F435] 求AT32F435VGT7的I2C代码

[复制链接]
593|6
yufeiwang1 发表于 2026-4-9 15:34 | 显示全部楼层 |阅读模式
void wk_i2c1_init(void)
{
  /* add user code begin i2c1_init 0 */

  /* add user code end i2c1_init 0 */

  gpio_init_type gpio_init_struct;

  gpio_default_para_init(&gpio_init_struct);

  /* add user code begin i2c1_init 1 */

  /* add user code end i2c1_init 1 */

  /* configure the SCL pin */
  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE8, GPIO_MUX_4);
  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
  gpio_init_struct.gpio_pins = GPIO_PINS_8;
  gpio_init(GPIOB, &gpio_init_struct);

  /* configure the SDA pin */
  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE9, GPIO_MUX_4);
  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
  gpio_init_struct.gpio_pins = GPIO_PINS_9;
  gpio_init(GPIOB, &gpio_init_struct);

   

  i2c_init(I2C1, 0, 0x50E0A6A6);
  i2c_own_address1_set(I2C1, I2C_ADDRESS_MODE_7BIT, 0xFE);
  i2c_ack_enable(I2C1, TRUE);
  i2c_clock_stretch_enable(I2C1, FALSE);
  i2c_general_call_enable(I2C1, FALSE);
  
  /* add user code begin i2c1_init 2 */

  /* add user code end i2c1_init 2 */



  i2c_enable(I2C1, TRUE);


  /* add user code end i2c1_init 3 */
}

==================== 初始化之后代码一直卡在     while(i2c_flag_get(I2C1, I2C_TDC_FLAG) == RESET);
uint16_t as5600_read_reg16(uint16_t reg)
{
        uint8_t buf[2];
    #define AS5600_ADDR 0x36 // 正确的7位地址

    /* 1. 发送寄存器地址 */
    // 注意:不要对 AS5600_ADDR 进行 << 1 操作
    i2c_transmit_set(I2C1, AS5600_ADDR, 1, I2C_SOFT_STOP_MODE, I2C_GEN_START_WRITE);
   
    // 增加 ACK 失败检查,防止死循环
    while(i2c_flag_get(I2C1, I2C_TDBE_FLAG) == RESET) {
        if(i2c_flag_get(I2C1, I2C_ACKFAIL_FLAG) == SET) return 0xFFFF;
    }
   
    i2c_data_send(I2C1, reg);
   
    // 等待传输完成 (TDC)
    while(i2c_flag_get(I2C1, I2C_TDC_FLAG) == RESET);

    /* 2. 读取2字节数据 */
    i2c_transmit_set(I2C1, AS5600_ADDR, 2, I2C_AUTO_STOP_MODE, I2C_GEN_START_READ);

    for(int i = 0; i < 2; i++) {
        while(i2c_flag_get(I2C1, I2C_RDBF_FLAG) == RESET);
        buf[i] = i2c_data_receive(I2C1);
    }

    // 等待自动停止位完成
    while(i2c_flag_get(I2C1, I2C_STOPF_FLAG) == RESET);
    i2c_flag_clear(I2C1, I2C_STOPF_FLAG);

    return (uint16_t)((buf[0] << 8) | buf[1]) & 0x0FFF;
}










h_x_zhong 发表于 2026-4-10 11:46 | 显示全部楼层
AT32_Work_Bench  生成的I2C不能用吗?
 楼主| yufeiwang1 发表于 2026-4-10 15:08 | 显示全部楼层
h_x_zhong 发表于 2026-4-10 11:46
AT32_Work_Bench  生成的I2C不能用吗?

不知道为什么用不了,一直是高电平,两根线,一点反应都没有
21mengnan 发表于 2026-4-13 19:07 | 显示全部楼层
一、基础信息
MCU:AT32F435VGT7
库:雅特力 AT32F435 标准库
默认使用:I2C1
SCL:PB6
SDA:PB7
速率:标准模式 100kHz / 快速模式 400kHz 可选
模式:主机模式(最常用)
 楼主| yufeiwang1 发表于 2026-4-16 11:46 | 显示全部楼层
刷积分
幻想收藏家 发表于 2026-5-11 07:59 | 显示全部楼层
你的代码中使用了`i2c_transmit_set`和`i2c_data_send`来发送寄存器地址,然后读取数据。这是一个标准的I2C读写流程。不过,你需要注意检查I2C总线是否忙碌,以及是否有设备响应。
DreamWanderer 发表于 2026-5-25 19:18 | 显示全部楼层
yufeiwang1 发表于 2026-4-10 15:08
不知道为什么用不了,一直是高电平,两根线,一点反应都没有

用软件模拟用起来更方便!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

36

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0