diff --git a/inc/LDC1612.h b/inc/LDC1612.h index d705296..0b0bb49 100644 --- a/inc/LDC1612.h +++ b/inc/LDC1612.h @@ -13,6 +13,8 @@ #include #include +#define LDC1612_ADDR (0x2B << 1) + /*Register Rddr*/ /***************************************************************************/ #define CONVERTION_RESULT_REG_START 0X00 @@ -33,9 +35,6 @@ /******************************************************************************/ -#define I2C_TIME_OUT (uint16_t)(10000) -#define LDC_I2C I2C0 -#define I2C_SPEED 400000 typedef enum { I2C_START = 0, @@ -45,10 +44,7 @@ typedef enum { I2C_STOP } i2c_process_enum; -#define I2C_OK 1 -#define I2C_FAIL 0 -#define I2C_END 1 - +#define I2C_SPEED 400000 #define RCU_IR_GPIO RCU_GPIOF #define RCU_I2C RCU_I2C0 #define I2C_SCL_PORT GPIOF @@ -57,32 +53,13 @@ typedef enum { #define I2C_SDA_PIN GPIO_PIN_0 #define I2C_GPIO_AF GPIO_AF_1 -#define LDC1612_ADDR (0x2B << 1) - -// LDC1612 寄存器地址 -#define RCOUNT0_ADDR 0x08 -#define SETTLECOUNT0_ADDR 0x10 -#define CLOCK_DIVIDERS0_ADDR 0x14 -#define ERROR_CONFIG_ADDR 0x19 -#define MUX_CONFIG_ADDR 0x1B -#define DRIVE_CURRENT0_ADDR 0x1E -#define CONFIG_ADDR 0x1A - - +#define I2C_TIME_OUT (uint16_t)(10000) +void I2C_config(void); +void I2C_scan(void); +uint8_t IIC_read_16bit(uint8_t reg, uint16_t *value); void LDC1612_read_sensor_infomation(void); -void LDC1612_I2CConfig(void); -void LDC1612_Init(void); -int LDC1612_read_reg(uint8_t device_address, uint8_t reg_address, uint8_t *data, uint16_t length); -int i2c_write_reg(uint8_t device_address, uint8_t *data); -uint8_t eeprom_byte_write_timeout(uint8_t device_address, uint8_t *data); - -void I2C_Scan(void); - -uint8_t IIC_read_16bit(uint8_t reg, uint16_t *value); - -int LDC_getID(void); #endif //LDC1612_H diff --git a/src/LDC1612.c b/src/LDC1612.c index 728afbf..075dec9 100644 --- a/src/LDC1612.c +++ b/src/LDC1612.c @@ -5,33 +5,8 @@ #include "LDC1612.h" -void LDC1612_read_sensor_infomation(void) -{ - uint16_t device_id; - uint8_t result; - // 读取设备ID - result = IIC_read_16bit(READ_DEVICE_ID, &device_id); - - if (result == 0) { - printf("Device ID: 0x%04X\n", device_id); - } else { - printf("Failed to read Device ID\n"); - } - -} - - - - - -/** - * @brief This function configure the I2C peripheral & GPIO - * @param[in] none - * @param[out] none - * @retval None - */ -void LDC1612_I2CConfig(void) { +void I2C_config(void) { rcu_periph_clock_enable(RCU_IR_GPIO); rcu_periph_clock_enable(RCU_I2C); @@ -44,357 +19,26 @@ void LDC1612_I2CConfig(void) { gpio_mode_set(I2C_SDA_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, I2C_SDA_PIN); gpio_output_options_set(I2C_SDA_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SDA_PIN); - i2c_clock_config(LDC_I2C, I2C_SPEED, I2C_DTCY_2); + i2c_clock_config(I2C0, I2C_SPEED, I2C_DTCY_2); - i2c_mode_addr_config(LDC_I2C, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, LDC1612_ADDR); - i2c_enable(LDC_I2C); - i2c_ack_config(LDC_I2C, I2C_ACK_ENABLE); -} - - -/** - * @brief 向I2C设备寄存器写入数据 - * @param device_address: 设备地址 - * @param data: 要写入的数据 - * @retval int: 0表示成功,-1表示超时 - */ -int i2c_write_reg(uint8_t device_address, uint8_t *data) -{ - uint32_t timeout = 0; - printf("debug tag- 0\r\n"); - // 确保 I2C 总线空闲 - while (i2c_flag_get(LDC_I2C, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - printf("debug tag- 1-\r\n"); - return -1; // 超时返回错误 - } - i2c_start_on_bus(LDC_I2C); - timeout = 0; - printf("debug tag- 1\r\n"); - - // 等待起始条件发送完成 - while (!i2c_flag_get(LDC_I2C, I2C_FLAG_SBSEND) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - return -1; // 超时返回错误 - } - i2c_master_addressing(LDC_I2C, device_address, I2C_TRANSMITTER); - timeout = 0; - printf("debug tag- 2\r\n"); - - // 等待地址发送完成 - while (!i2c_flag_get(LDC_I2C, I2C_FLAG_ADDSEND) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - printf("debug tag- 3-\r\n"); - return -1; // 超时返回错误 - } - i2c_flag_clear(LDC_I2C, I2C_FLAG_ADDSEND); - timeout = 0; - printf("debug tag- 3\r\n"); - - // 发送寄存器地址和数据 - for (int i = 0; i < 3; i++) { - while (!i2c_flag_get(LDC_I2C, I2C_FLAG_TBE) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - return -1; // 超时返回错误 - } - i2c_data_transmit(LDC_I2C, data[i]); - printf("iic_value:%x\r\n", data[i]); - timeout = 0; - } - timeout = 0; - - // 生成停止条件 - while (!i2c_flag_get(LDC_I2C, I2C_FLAG_BTC) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - return -1; // 超时返回错误 - } - i2c_stop_on_bus(LDC_I2C); - timeout = 0; - - // 确保停止条件已发送完成 - while (i2c_flag_get(LDC_I2C, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - return -1; // 超时返回错误 - } - - printf("test info\r\n"); - return 0; -} - -uint8_t eeprom_byte_write_timeout(uint8_t device_address, uint8_t *data) -{ - uint8_t state = I2C_START; - uint16_t timeout = 0; - uint8_t i2c_timeout_flag = 0; - - /* enable acknowledge */ - i2c_ack_config(LDC_I2C, I2C_ACK_ENABLE); - while(!(i2c_timeout_flag)) { - switch(state) { - case I2C_START: - /* i2c master sends start signal only when the bus is idle */ - while(i2c_flag_get(LDC_I2C, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) { - timeout++; - } - if(timeout < I2C_TIME_OUT) { - i2c_start_on_bus(LDC_I2C); - timeout = 0; - state = I2C_SEND_ADDRESS; - } else { - timeout = 0; - state = I2C_START; - printf("i2c bus is busy in WRITE BYTE!\n"); - } - break; - case I2C_SEND_ADDRESS: - /* i2c master sends START signal successfully */ - while((!i2c_flag_get(LDC_I2C, I2C_FLAG_SBSEND)) && (timeout < I2C_TIME_OUT)) { - timeout++; - } - if(timeout < I2C_TIME_OUT) { - i2c_master_addressing(LDC_I2C, device_address, I2C_TRANSMITTER); - timeout = 0; - state = I2C_CLEAR_ADDRESS_FLAG; - } else { - timeout = 0; - state = I2C_START; - printf("i2c master sends start signal timeout in WRITE BYTE!\n"); - } - break; - case I2C_CLEAR_ADDRESS_FLAG: - /* address flag set means i2c slave sends ACK */ - while((!i2c_flag_get(LDC_I2C, I2C_FLAG_ADDSEND)) && (timeout < I2C_TIME_OUT)) { - timeout++; - } - if(timeout < I2C_TIME_OUT) { - i2c_flag_clear(LDC_I2C, I2C_FLAG_ADDSEND); - timeout = 0; - state = I2C_TRANSMIT_DATA; - } else { - timeout = 0; - state = I2C_START; - printf("i2c master clears address flag timeout in WRITE BYTE!\n"); - } - break; - case I2C_TRANSMIT_DATA: - /* wait until the transmit data buffer is empty */ - while((!i2c_flag_get(LDC_I2C, I2C_FLAG_TBE)) && (timeout < I2C_TIME_OUT)) { - timeout++; - } - if(timeout < I2C_TIME_OUT) { - /* send the EEPROM's internal address to write to : only one byte address */ - i2c_data_transmit(LDC_I2C, data[0]); - timeout = 0; - } else { - timeout = 0; - state = I2C_START; - printf("i2c master sends data timeout in WRITE BYTE!\n"); - } - - /* wait until BTC bit is set */ - while((!i2c_flag_get(LDC_I2C, I2C_FLAG_BTC)) && (timeout < I2C_TIME_OUT)) { - timeout++; - } - if(timeout < I2C_TIME_OUT) { - /* send the EEPROM's internal address to write to : only one byte address */ - i2c_data_transmit(LDC_I2C, data[1]); - timeout = 0; - } else { - timeout = 0; - state = I2C_START; - printf("i2c master sends data timeout in WRITE 1 BYTE!\n"); - } - /* wait until BTC bit is set */ - while((!i2c_flag_get(LDC_I2C, I2C_FLAG_BTC)) && (timeout < I2C_TIME_OUT)) { - timeout++; - } - if(timeout < I2C_TIME_OUT) { - /* send the EEPROM's internal address to write to : only one byte address */ - i2c_data_transmit(LDC_I2C, data[2]); - timeout = 0; - } else { - timeout = 0; - state = I2C_START; - printf("i2c master sends data timeout in WRITE 2 BYTE!\n"); - } - /* wait until BTC bit is set */ - while((!i2c_flag_get(LDC_I2C, I2C_FLAG_BTC)) && (timeout < I2C_TIME_OUT)) { - timeout++; - } - if(timeout < I2C_TIME_OUT) { - state = I2C_STOP; - timeout = 0; - } else { - timeout = 0; - state = I2C_START; - printf("i2c master sends data timeout in WRITE BYTE!\n"); - } - break; - case I2C_STOP: - /* send a stop condition to I2C bus */ - i2c_stop_on_bus(LDC_I2C); - /* i2c master sends STOP signal successfully */ - while((I2C_CTL0(LDC_I2C) & I2C_CTL0_STOP) && (timeout < I2C_TIME_OUT)) { - timeout++; - } - if(timeout < I2C_TIME_OUT) { - timeout = 0; - state = I2C_END; - i2c_timeout_flag = I2C_OK; - } else { - timeout = 0; - state = I2C_START; - printf("i2c master sends stop signal timeout in WRITE BYTE!\n"); - } - break; - default: - state = I2C_START; - i2c_timeout_flag = I2C_OK; - timeout = 0; - printf("i2c master sends start signal in WRITE BYTE.\n"); - break; - } - } - return I2C_END; + // i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, LDC1612_ADDR); + i2c_enable(I2C0); + i2c_ack_config(I2C0, I2C_ACK_ENABLE); } void LDC1612_Init(void) { - uint8_t RCOUNT0_ALL[3]={RCOUNT0_ADDR,0x05,0x36};//csdn - uint8_t SETTLECOUNT0_ALL[3]={SETTLECOUNT0_ADDR,0x00,0x0a}; - uint8_t CLOCK_DIVIDERS0_ALL[3]={CLOCK_DIVIDERS0_ADDR,0x10,0x02}; - uint8_t ERROR_CONFIG_ALL[3]={ERROR_CONFIG_ADDR,0x00,0x00}; - uint8_t MUX_CONFIG_ALL[3]={MUX_CONFIG_ADDR,0x82,0x0c}; - uint8_t DRIVE_CURRENT0_ALL[3]={DRIVE_CURRENT0_ADDR,0x90,0x00}; - uint8_t CONFIG_ALL[3]={CONFIG_ADDR,0x14,0x01};//csdn + uint8_t RCOUNT0_ALL[3]={SET_CONVERSION_TIME_REG_START,0x05,0x36};//csdn + uint8_t SETTLECOUNT0_ALL[3]={SET_LC_STABILIZE_REG_START,0x00,0x0a}; + uint8_t CLOCK_DIVIDERS0_ALL[3]={SET_FREQ_REG_START,0x10,0x02}; + uint8_t ERROR_CONFIG_ALL[3]={ERROR_CONFIG_REG,0x00,0x00}; + uint8_t MUX_CONFIG_ALL[3]={MUL_CONFIG_REG,0x82,0x0c}; + uint8_t DRIVE_CURRENT0_ALL[3]={SET_DRIVER_CURRENT_REG,0x90,0x00}; + uint8_t CONFIG_ALL[3]={SENSOR_CONFIG_REG,0x14,0x01};//csdn - // LDC1612_I2CConfig(); - - // int ret = i2c_write_reg(LDC1612_ADDR, RCOUNT0_ALL); - // - // printf("ret:%d\r\n",ret); - i2c_write_reg(LDC1612_ADDR, RCOUNT0_ALL); - // eeprom_byte_write_timeout(LDC1612_ADDR, SETTLECOUNT0_ALL); - delay_ms(100); - i2c_write_reg(LDC1612_ADDR, SETTLECOUNT0_ALL); - delay_ms(100); - // i2c_write_reg(LDC1612_ADDR, CLOCK_DIVIDERS0_ALL); - // delay_ms(100); - // i2c_write_reg(LDC1612_ADDR, ERROR_CONFIG_ALL); - // delay_ms(100); - // i2c_write_reg(LDC1612_ADDR, MUX_CONFIG_ALL); - // delay_ms(100); - // i2c_write_reg(LDC1612_ADDR, DRIVE_CURRENT0_ALL); - // delay_ms(100); - // i2c_write_reg(LDC1612_ADDR, CONFIG_ALL); } -/** - * @brief 从I2C设备寄存器读取数据 - * @param device_address: 设备地址 - * @param reg_address: 寄存器地址 - * @param data: 存储读取数据的缓冲区 - * @param length: 要读取的数据长度 - * @retval int: 0表示成功,-1表示超时 - */ -int LDC1612_read_reg(uint8_t device_address, uint8_t reg_address, uint8_t *data, uint16_t length) -{ - uint32_t timeout = 0; - i2c_ack_config(LDC_I2C, I2C_ACK_ENABLE); - - // 判断总线是否忙 - while (i2c_flag_get(LDC_I2C, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - return -1; // 超时返回错误 - } - i2c_start_on_bus(LDC_I2C); //发送开始信号 - timeout = 0; - - // 等待起始条件发送完成 - while (!i2c_flag_get(LDC_I2C, I2C_FLAG_SBSEND) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - return -1; // 超时返回错误 - } - i2c_master_addressing(LDC_I2C, device_address, I2C_TRANSMITTER); //设置为发送模式 - timeout = 0; - - // 等待地址发送完成 - while (!i2c_flag_get(LDC_I2C, I2C_FLAG_ADDSEND) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - return -1; // 超时返回错误 - } - i2c_flag_clear(LDC_I2C, I2C_FLAG_ADDSEND); - timeout = 0; - - // 开始接收数据 - while (!i2c_flag_get(LDC_I2C, I2C_FLAG_TBE) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - return -1; // 超时返回错误 - } - i2c_data_transmit(LDC_I2C, reg_address); //发送寄存器地址 - timeout = 0; - - // 生成重复起始条件 - while (!i2c_flag_get(LDC_I2C, I2C_FLAG_BTC) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - return -1; // 超时返回错误 - } - i2c_start_on_bus(LDC_I2C); - timeout = 0; - - // 等待重复起始条件发送完成 - while (!i2c_flag_get(LDC_I2C, I2C_FLAG_SBSEND) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - return -1; // 超时返回错误 - } - i2c_master_addressing(LDC_I2C, device_address, I2C_RECEIVER); - timeout = 0; - - // 等待地址发送完成 - while (!i2c_flag_get(LDC_I2C, I2C_FLAG_ADDSEND) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - return -1; // 超时返回错误 - } - i2c_flag_clear(LDC_I2C, I2C_FLAG_ADDSEND); - timeout = 0; - -// 读取数据 -for (uint16_t i = 0; i < length; i++) { - while (!i2c_flag_get(LDC_I2C, I2C_FLAG_RBNE) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - return -1; // 超时返回错误 - } - if (i == length - 1) { - i2c_ack_config(LDC_I2C, I2C_ACK_DISABLE); // 禁用ACK - i2c_stop_on_bus(LDC_I2C); // 生成停止条件 - } - data[i] = i2c_data_receive(LDC_I2C); - timeout = 0; -} -i2c_ack_config(LDC_I2C, I2C_ACK_ENABLE); // 重新启用ACK - - // 生成停止条件 - i2c_stop_on_bus(LDC_I2C); - timeout = 0; - - return 0; -} - -void I2C_Scan(void) { +void I2C_scan(void) { uint32_t timeout; uint8_t address; int found_devices = 0; @@ -405,37 +49,38 @@ void I2C_Scan(void) { timeout = 0; // 生成起始条件 - while (i2c_flag_get(LDC_I2C, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) + while (i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) timeout++; if (timeout >= I2C_TIME_OUT) { continue; // 超时,跳过该地址 } - i2c_start_on_bus(LDC_I2C); + i2c_start_on_bus(I2C0); timeout = 0; // 等待起始条件发送完成 - while (!i2c_flag_get(LDC_I2C, I2C_FLAG_SBSEND) && (timeout < I2C_TIME_OUT)) + while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND) && (timeout < I2C_TIME_OUT)) timeout++; if (timeout >= I2C_TIME_OUT) { continue; // 超时,跳过该地址 } - i2c_master_addressing(LDC_I2C, address << 1, I2C_TRANSMITTER); + i2c_master_addressing(I2C0, (address << 1), I2C_TRANSMITTER); timeout = 0; // 等待地址发送完成 - while (!i2c_flag_get(LDC_I2C, I2C_FLAG_ADDSEND) && (timeout < I2C_TIME_OUT)) + while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) && (timeout < I2C_TIME_OUT)) timeout++; if (timeout < I2C_TIME_OUT) { - i2c_flag_clear(LDC_I2C, I2C_FLAG_ADDSEND); + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); printf("Found device at 0x%02X\r\n", address); found_devices++; } // 生成停止条件 - i2c_stop_on_bus(LDC_I2C); + i2c_stop_on_bus(I2C0); + timeout = 0; - while (i2c_flag_get(LDC_I2C, I2C_FLAG_STPDET) && (timeout < I2C_TIME_OUT)) + while (i2c_flag_get(I2C0, I2C_FLAG_STPDET) && (timeout < I2C_TIME_OUT)) timeout++; } @@ -447,7 +92,6 @@ void I2C_Scan(void) { } - /** * @brief 读取16位I2C数据,带有超时机制 * @param reg: 要读取的寄存器地址 @@ -468,7 +112,7 @@ uint8_t IIC_read_16bit(uint8_t reg, uint16_t *value) { i2c_master_addressing(I2C0, LDC1612_ADDR, I2C_TRANSMITTER); timeout = 0; while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)) { - if ((timeout++) > I2C_TIME_OUT) return 1; // 超时 + if ((timeout++) > I2C_TIME_OUT) return 2; // 超时 } i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); @@ -476,146 +120,66 @@ uint8_t IIC_read_16bit(uint8_t reg, uint16_t *value) { i2c_data_transmit(I2C0, reg); timeout = 0; while (!i2c_flag_get(I2C0, I2C_FLAG_TBE)) { - if ((timeout++) > I2C_TIME_OUT) return 1; // 超时 + if ((timeout++) > I2C_TIME_OUT) return 3; // 超时 } // 重新启动信号 i2c_start_on_bus(I2C0); timeout = 0; while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)) { - if ((timeout++) > I2C_TIME_OUT) return 1; // 超时 + if ((timeout++) > I2C_TIME_OUT) return 4; // 超时 } // 发送从设备地址和读信号 i2c_master_addressing(I2C0, LDC1612_ADDR, I2C_RECEIVER); timeout = 0; while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)) { - if ((timeout++) > I2C_TIME_OUT) return 1; // 超时 + if ((timeout++) > I2C_TIME_OUT) return 5; // 超时 } i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); // 读取数据 timeout = 0; while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE)) { - if ((timeout++) > I2C_TIME_OUT) return 1; // 超时 + if ((timeout++) > I2C_TIME_OUT) return 6; // 超时 } *value = i2c_data_receive(I2C0) << 8; // 读取高8位 timeout = 0; while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE)) { - if ((timeout++) > I2C_TIME_OUT) return 1; // 超时 + if ((timeout++) > I2C_TIME_OUT) return 7; // 超时 } *value |= i2c_data_receive(I2C0); // 读取低8位 // 发送停止信号 i2c_stop_on_bus(I2C0); timeout = 0; - while (I2C_CTL0(I2C0) & I2C_CTL0_STOP) { - if ((timeout++) > I2C_TIME_OUT) return 1; // 超时 - } return 0; // 成功 } +void LDC1612_read_sensor_infomation(void) +{ + uint16_t device_id; + uint16_t manufacturer_id; + uint8_t result; -int LDC_getID(void) { - uint8_t data[2] = {0}; - uint16_t timeout = 0; + // 读取设备ID + result = IIC_read_16bit(READ_DEVICE_ID, &device_id); - i2c_ack_config(I2C0, I2C_ACK_ENABLE); - - while (i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) //判断IIC总线是否忙,发送起始信号 - timeout++; - if (timeout < I2C_TIME_OUT) { - i2c_start_on_bus(I2C0); - timeout = 0; + if (result == 0) { + printf("Device ID: 0x%04X\n", device_id); } else { - printf("err\r\n"); - return -4101; // 超时返回错误 + printf("Failed to read Device ID\n"); + printf("result: %d\n", result); } - while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND) && (timeout < I2C_TIME_OUT)) //判断起始位是否发送,设置sensor地址并设置为写 - timeout++; - if (timeout < I2C_TIME_OUT) { - i2c_master_addressing(I2C0, (0x2B << 1), I2C_TRANSMITTER); - timeout = 0; + result = IIC_read_16bit(READ_MANUFACTURER_ID, &manufacturer_id); + + if (result == 0) { + printf("manufacturer ID: 0x%04X\n", manufacturer_id); } else { - return -4102; // 超时返回错误 + printf("Failed to read manufacturer ID\n"); + printf("result: %d\n", result); } - - while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout < I2C_TIME_OUT) { - i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); - timeout = 0; - } else { - return -4103; // 超时返回错误 - } - - while (!i2c_flag_get(I2C0, I2C_FLAG_TBE) && (timeout < I2C_TIME_OUT)) //判断地址是否发送完成,然后发送寄存器地址 - timeout++; - if (timeout < I2C_TIME_OUT) { - i2c_data_transmit(I2C0, 0x7f); - timeout = 0; - // i2c_start_on_bus(IR_I2C); - } else { - return -4104; // 超时返回错误 - } - - while (i2c_flag_get(I2C0, I2C_FLAG_BTC) && (timeout < I2C_TIME_OUT)) //判断发送缓冲器是否为空,为空后(发送完毕)重新发送开始信号 - timeout++; - if (timeout < I2C_TIME_OUT) { - i2c_start_on_bus(I2C0); - timeout = 0; - } else { - return -4105; // 超时返回错误 - } - - while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND) && (timeout < I2C_TIME_OUT)) { - timeout++; - } - if (timeout < I2C_TIME_OUT) { - i2c_master_addressing(I2C0, (0x2B << 1), I2C_RECEIVER); - timeout = 0; - } else { - return -4106; // 超时返回错误 - } - - while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout < I2C_TIME_OUT) { - i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); - timeout = 0; - } else { - return -4107; // 超时返回错误 - } - - // 读取第一个字节的数据 - while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE) && (timeout < I2C_TIME_OUT)) { - timeout++; - } - if (timeout < I2C_TIME_OUT) { - data[0] = i2c_data_receive(I2C0); - timeout = 0; - } else { - return -4108; // 超时返回错误 - } - i2c_ack_config(I2C0, I2C_ACK_DISABLE); - - // 读取第二个字节的数据 - while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE) && (timeout < I2C_TIME_OUT)) { - timeout++; - } - if (timeout < I2C_TIME_OUT) { - data[1] = i2c_data_receive(I2C0); - timeout = 0; - } else { - return -4109; // 超时返回错误 - } - - i2c_stop_on_bus(I2C0); - - printf("device id:%x %x\r\n",data[0],data[1]); - - return 0; } \ No newline at end of file diff --git a/src/main.c b/src/main.c index 91783cf..7c816e7 100644 --- a/src/main.c +++ b/src/main.c @@ -52,15 +52,14 @@ int main(void) systick_config(); RS485_config(); led_config(); + I2C_config(); // delay_ms(5000); printf("\r\n"); printf("XLSW-3DP-LDC1612! V0.0.1\r\n"); printf("\r\n"); - LDC1612_I2CConfig(); - // LDC1612_Init(); - // I2C_Scan(); + I2C_scan(); LDC1612_read_sensor_infomation(); @@ -68,14 +67,6 @@ int main(void) while(1){ - // LDC1612_read_reg(LDC1612_ADDR, 0x7f, data, 2); - // printf("msb:%x %x\r\n",data[0],data[1]); - // LDC1612_read_reg(LDC1612_ADDR, 0x01, data, 2); - // printf("msb:%x %x\r\n",data[0],data[1]); - // printf("hello world!\r\n"); - // LDC1612_Init(); - // LDC1612_read_reg(LDC1612_ADDR, 0x01, data, 2); - delay_ms(1000); } }