generated from hulk/gd32e23x_template
	iic驱动重写
This commit is contained in:
		| @@ -27,7 +27,6 @@ set(TARGET_C_SRC | |||||||
|         ${CMAKE_SOURCE_DIR}/src/peripheral.c |         ${CMAKE_SOURCE_DIR}/src/peripheral.c | ||||||
|         ${CMAKE_SOURCE_DIR}/src/LDC1612.c |         ${CMAKE_SOURCE_DIR}/src/LDC1612.c | ||||||
|         ${CMAKE_SOURCE_DIR}/src/RS485.c |         ${CMAKE_SOURCE_DIR}/src/RS485.c | ||||||
|         ${CMAKE_SOURCE_DIR}/src/i2c.c |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| add_executable(xlsw_3dp_LDC1612 ${TARGET_C_SRC}) | add_executable(xlsw_3dp_LDC1612 ${TARGET_C_SRC}) | ||||||
|   | |||||||
| @@ -20,6 +20,8 @@ | |||||||
| #define LED_TIMER           TIMER16 | #define LED_TIMER           TIMER16 | ||||||
| #define LED_IRQ             TIMER16_IRQn | #define LED_IRQ             TIMER16_IRQn | ||||||
|  |  | ||||||
|  | #define I2C_TIME_OUT    (uint16_t)(10000) | ||||||
|  | #define LDC_I2C       I2C0 | ||||||
| #define I2C_SPEED 100000 | #define I2C_SPEED 100000 | ||||||
|  |  | ||||||
| #define RCU_IR_GPIO RCU_GPIOF | #define RCU_IR_GPIO RCU_GPIOF | ||||||
| @@ -44,5 +46,7 @@ | |||||||
| void led_config(void); | void led_config(void); | ||||||
| void LDC1612_I2CConfig(void); | void LDC1612_I2CConfig(void); | ||||||
| void LDC1612_Init(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); | ||||||
|  |  | ||||||
| #endif //LDC1612_H | #endif //LDC1612_H | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								inc/i2c.h
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								inc/i2c.h
									
									
									
									
									
								
							| @@ -1,15 +0,0 @@ | |||||||
| // |  | ||||||
| // Created by dell on 24-12-4. |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #ifndef I2C_H |  | ||||||
| #define I2C_H |  | ||||||
|  |  | ||||||
| #include "gd32e23x_i2c.h" |  | ||||||
| #include "LDC1612.h" |  | ||||||
|  |  | ||||||
| #define I2C_TIME_OUT    (uint16_t)(5000) |  | ||||||
| #define LDC_I2C       I2C0 |  | ||||||
|  |  | ||||||
| int i2c_write_reg(uint8_t device_address, uint8_t *data); |  | ||||||
| #endif //I2C_H |  | ||||||
							
								
								
									
										201
									
								
								src/LDC1612.c
									
									
									
									
									
								
							
							
						
						
									
										201
									
								
								src/LDC1612.c
									
									
									
									
									
								
							| @@ -62,6 +62,86 @@ void LDC1612_I2CConfig(void) { | |||||||
|     i2c_ack_config(LDC_I2C, I2C_ACK_ENABLE); |     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"); | ||||||
|  |     // 生成起始条件 | ||||||
|  |     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; | ||||||
|  |     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(I2C0, 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"); | ||||||
|  |  | ||||||
|  |     // 发送寄存器地址 | ||||||
|  |     while (!i2c_flag_get(LDC_I2C, I2C_FLAG_TBE) && (timeout < I2C_TIME_OUT)) | ||||||
|  |         timeout++; | ||||||
|  |     if (timeout >= I2C_TIME_OUT) { | ||||||
|  |         return -1; // 超时返回错误 | ||||||
|  |     } | ||||||
|  |     // 发送寄存器地址和数据 | ||||||
|  |     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_STPDET) && (timeout < I2C_TIME_OUT)) | ||||||
|  |         timeout++; | ||||||
|  |     if (timeout >= I2C_TIME_OUT) { | ||||||
|  |         return -1; // 超时返回错误 | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     printf("test info"); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void LDC1612_Init(void) { | ||||||
|     uint8_t RCOUNT0_ALL[3]={RCOUNT0_ADDR,0x05,0x36};//csdn |     uint8_t RCOUNT0_ALL[3]={RCOUNT0_ADDR,0x05,0x36};//csdn | ||||||
|     uint8_t SETTLECOUNT0_ALL[3]={SETTLECOUNT0_ADDR,0x00,0x0a}; |     uint8_t SETTLECOUNT0_ALL[3]={SETTLECOUNT0_ADDR,0x00,0x0a}; | ||||||
|     uint8_t CLOCK_DIVIDERS0_ALL[3]={CLOCK_DIVIDERS0_ADDR,0x10,0x02}; |     uint8_t CLOCK_DIVIDERS0_ALL[3]={CLOCK_DIVIDERS0_ADDR,0x10,0x02}; | ||||||
| @@ -70,13 +150,118 @@ uint8_t MUX_CONFIG_ALL[3]={MUX_CONFIG_ADDR,0x82,0x0c}; | |||||||
|     uint8_t DRIVE_CURRENT0_ALL[3]={DRIVE_CURRENT0_ADDR,0x90,0x00}; |     uint8_t DRIVE_CURRENT0_ALL[3]={DRIVE_CURRENT0_ADDR,0x90,0x00}; | ||||||
|     uint8_t CONFIG_ALL[3]={CONFIG_ADDR,0x14,0x01};//csdn |     uint8_t CONFIG_ALL[3]={CONFIG_ADDR,0x14,0x01};//csdn | ||||||
|  |  | ||||||
| void LDC1612_Init(void) { |  | ||||||
|     LDC1612_I2CConfig(); |     LDC1612_I2CConfig(); | ||||||
|     i2c_write_reg(LDC1612_ADDR, RCOUNT0_ALL); |  | ||||||
|     i2c_write_reg(LDC1612_ADDR, SETTLECOUNT0_ALL); |     int ret = i2c_write_reg(LDC1612_ADDR, RCOUNT0_ALL); | ||||||
|     i2c_write_reg(LDC1612_ADDR, CLOCK_DIVIDERS0_ALL); |  | ||||||
|     i2c_write_reg(LDC1612_ADDR, ERROR_CONFIG_ALL); |     printf("ret:%d\r\n",ret); | ||||||
|     i2c_write_reg(LDC1612_ADDR, MUX_CONFIG_ALL); |     // i2c_write_reg(LDC1612_ADDR, RCOUNT0_ALL); | ||||||
|     i2c_write_reg(LDC1612_ADDR, DRIVE_CURRENT0_ALL); | //     i2c_write_reg(LDC1612_ADDR, SETTLECOUNT0_ALL); | ||||||
|     i2c_write_reg(LDC1612_ADDR, CONFIG_ALL); | //     i2c_write_reg(LDC1612_ADDR, CLOCK_DIVIDERS0_ALL); | ||||||
|  | //     i2c_write_reg(LDC1612_ADDR, ERROR_CONFIG_ALL); | ||||||
|  | //     i2c_write_reg(LDC1612_ADDR, MUX_CONFIG_ALL); | ||||||
|  | //     i2c_write_reg(LDC1612_ADDR, DRIVE_CURRENT0_ALL); | ||||||
|  | //     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; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										78
									
								
								src/i2c.c
									
									
									
									
									
								
							
							
						
						
									
										78
									
								
								src/i2c.c
									
									
									
									
									
								
							| @@ -1,78 +0,0 @@ | |||||||
| // |  | ||||||
| // Created by dell on 24-12-4. |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include "i2c.h" |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * @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; |  | ||||||
|  |  | ||||||
|     // 生成起始条件 |  | ||||||
|     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; // 超时返回错误 |  | ||||||
|     } |  | ||||||
|     // 发送寄存器地址和数据 |  | ||||||
|     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]); |  | ||||||
|     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_STPDET) && (timeout < I2C_TIME_OUT)) |  | ||||||
|         timeout++; |  | ||||||
|     if (timeout >= I2C_TIME_OUT) { |  | ||||||
|         return -1; // 超时返回错误 |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return 0; |  | ||||||
| } |  | ||||||
							
								
								
									
										12
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								src/main.c
									
									
									
									
									
								
							| @@ -33,8 +33,18 @@ int main(void) | |||||||
|     printf("XLSW-3DP-LDC1612! V0.0.1\r\n"); |     printf("XLSW-3DP-LDC1612! V0.0.1\r\n"); | ||||||
|     printf("\r\n"); |     printf("\r\n"); | ||||||
|  |  | ||||||
|  |     LDC1612_Init(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     uint8_t data[8] = {0}; | ||||||
|  |     uint32_t value = 0; | ||||||
|  |  | ||||||
|     while(1){ |     while(1){ | ||||||
|     printf("hello world!\r\n"); |  | ||||||
|  |         // LDC1612_read_reg(LDC1612_ADDR, 0x00, data, 2); | ||||||
|  |     // printf("msb:%x %x\r\n",data[0],data[1]); | ||||||
|  |     //     printf("hello world!\r\n"); | ||||||
|     delay_ms(5000); |     delay_ms(5000); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user