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;
}
|
|