generated from hulk/gd32e23x_template
iic驱动重写
This commit is contained in:
parent
7a3e93f5d8
commit
dde90dc162
@ -27,7 +27,6 @@ set(TARGET_C_SRC
|
||||
${CMAKE_SOURCE_DIR}/src/peripheral.c
|
||||
${CMAKE_SOURCE_DIR}/src/LDC1612.c
|
||||
${CMAKE_SOURCE_DIR}/src/RS485.c
|
||||
${CMAKE_SOURCE_DIR}/src/i2c.c
|
||||
)
|
||||
|
||||
add_executable(xlsw_3dp_LDC1612 ${TARGET_C_SRC})
|
||||
|
@ -20,6 +20,8 @@
|
||||
#define LED_TIMER TIMER16
|
||||
#define LED_IRQ TIMER16_IRQn
|
||||
|
||||
#define I2C_TIME_OUT (uint16_t)(10000)
|
||||
#define LDC_I2C I2C0
|
||||
#define I2C_SPEED 100000
|
||||
|
||||
#define RCU_IR_GPIO RCU_GPIOF
|
||||
@ -44,5 +46,7 @@
|
||||
void led_config(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);
|
||||
|
||||
#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
|
215
src/LDC1612.c
215
src/LDC1612.c
@ -62,21 +62,206 @@ void LDC1612_I2CConfig(void) {
|
||||
i2c_ack_config(LDC_I2C, I2C_ACK_ENABLE);
|
||||
}
|
||||
|
||||
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
|
||||
/**
|
||||
* @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 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
|
||||
|
||||
LDC1612_I2CConfig();
|
||||
i2c_write_reg(LDC1612_ADDR, RCOUNT0_ALL);
|
||||
i2c_write_reg(LDC1612_ADDR, SETTLECOUNT0_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);
|
||||
}
|
||||
|
||||
int ret = i2c_write_reg(LDC1612_ADDR, RCOUNT0_ALL);
|
||||
|
||||
printf("ret:%d\r\n",ret);
|
||||
// i2c_write_reg(LDC1612_ADDR, RCOUNT0_ALL);
|
||||
// i2c_write_reg(LDC1612_ADDR, SETTLECOUNT0_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("\r\n");
|
||||
|
||||
LDC1612_Init();
|
||||
|
||||
|
||||
|
||||
uint8_t data[8] = {0};
|
||||
uint32_t value = 0;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user