Compare commits

...

2 Commits

Author SHA1 Message Date
7e05771ed8 finish Tmp112A 2024-12-07 14:50:59 +08:00
1d1c0fce21 IIC scan 2024-12-07 12:14:09 +08:00
5 changed files with 95 additions and 519 deletions

View File

@ -13,6 +13,9 @@
#include <stdio.h>
#include <stdlib.h>
#define LDC1612_ADDR (0x2B << 1)
#define TMP112A_ADDR (0x49 << 1)
/*Register Rddr*/
/***************************************************************************/
#define CONVERTION_RESULT_REG_START 0X00
@ -33,9 +36,6 @@
/******************************************************************************/
#define I2C_TIME_OUT (uint16_t)(10000)
#define LDC_I2C I2C0
#define I2C_SPEED 400000
typedef enum {
I2C_START = 0,
@ -45,10 +45,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 +54,13 @@ typedef enum {
#define I2C_SDA_PIN GPIO_PIN_0
#define I2C_GPIO_AF GPIO_AF_1
#define LDC1612_ADDR (0x2B << 1)
#define I2C_TIME_OUT (uint16_t)(10000)
// 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
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_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);
uint32_t TMP112A_ReadTemperature(void);
#endif //LDC1612_H

View File

@ -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);
i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, 0x72);
i2c_enable(I2C0);
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
}
// void LDC1612_Init(void) {
// 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
//
// }
/**
* @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;
}
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();
// 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++;
}
@ -446,81 +91,11 @@ void I2C_Scan(void) {
}
}
/**
* @brief 16I2C数据
* @param reg:
* @param value:
* @retval 0: 1:
*/
uint8_t IIC_read_16bit(uint8_t reg, uint16_t *value) {
uint32_t timeout = 0;
// 发送启动信号
i2c_start_on_bus(I2C0);
timeout = 0;
while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)) {
if ((timeout++) > I2C_TIME_OUT) return 1; // 超时
}
// 发送从设备地址和写信号
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; // 超时
}
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
// 发送寄存器地址
i2c_data_transmit(I2C0, reg);
timeout = 0;
while (!i2c_flag_get(I2C0, I2C_FLAG_TBE)) {
if ((timeout++) > I2C_TIME_OUT) return 1; // 超时
}
// 重新启动信号
i2c_start_on_bus(I2C0);
timeout = 0;
while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)) {
if ((timeout++) > I2C_TIME_OUT) return 1; // 超时
}
// 发送从设备地址和读信号
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; // 超时
}
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
// 读取数据
timeout = 0;
while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE)) {
if ((timeout++) > I2C_TIME_OUT) return 1; // 超时
}
*value = i2c_data_receive(I2C0) << 8; // 读取高8位
timeout = 0;
while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE)) {
if ((timeout++) > I2C_TIME_OUT) return 1; // 超时
}
*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; // 成功
}
int LDC_getID(void) {
uint32_t TMP112A_ReadTemperature(void) {
uint8_t data[2] = {0};
uint16_t raw_temp = 0;
uint16_t timeout = 0;
uint32_t temperature = 0;
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
@ -531,16 +106,16 @@ int LDC_getID(void) {
timeout = 0;
} else {
printf("err\r\n");
return -4101; // 超时返回错误
return -1; // 超时返回错误
}
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);
i2c_master_addressing(I2C0, TMP112A_ADDR, I2C_TRANSMITTER);
timeout = 0;
} else {
return -4102; // 超时返回错误
return -1; // 超时返回错误
}
while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) && (timeout < I2C_TIME_OUT))
@ -549,17 +124,17 @@ int LDC_getID(void) {
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
timeout = 0;
} else {
return -4103; // 超时返回错误
return -1; // 超时返回错误
}
while (!i2c_flag_get(I2C0, I2C_FLAG_TBE) && (timeout < I2C_TIME_OUT)) //判断地址是否发送完成,然后发送寄存器地址
timeout++;
if (timeout < I2C_TIME_OUT) {
i2c_data_transmit(I2C0, 0x7f);
i2c_data_transmit(I2C0, 0x00);
timeout = 0;
// i2c_start_on_bus(IR_I2C);
// i2c_start_on_bus(I2C0);
} else {
return -4104; // 超时返回错误
return -1; // 超时返回错误
}
while (i2c_flag_get(I2C0, I2C_FLAG_BTC) && (timeout < I2C_TIME_OUT)) //判断发送缓冲器是否为空,为空后(发送完毕)重新发送开始信号
@ -568,17 +143,17 @@ int LDC_getID(void) {
i2c_start_on_bus(I2C0);
timeout = 0;
} else {
return -4105; // 超时返回错误
return -1; // 超时返回错误
}
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);
i2c_master_addressing(I2C0, TMP112A_ADDR, I2C_RECEIVER);
timeout = 0;
} else {
return -4106; // 超时返回错误
return -1; // 超时返回错误
}
while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) && (timeout < I2C_TIME_OUT))
@ -587,7 +162,7 @@ int LDC_getID(void) {
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
timeout = 0;
} else {
return -4107; // 超时返回错误
return -1; // 超时返回错误
}
// 读取第一个字节的数据
@ -598,9 +173,10 @@ int LDC_getID(void) {
data[0] = i2c_data_receive(I2C0);
timeout = 0;
} else {
return -4108; // 超时返回错误
return -1; // 超时返回错误
}
i2c_ack_config(I2C0, I2C_ACK_DISABLE);
i2c_ack_config(I2C0, I2C_ACK_DISABLE); // 关闭发送ACK它会在下一个字节完成后发送NAK
// 读取第二个字节的数据
while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE) && (timeout < I2C_TIME_OUT)) {
@ -610,12 +186,17 @@ int LDC_getID(void) {
data[1] = i2c_data_receive(I2C0);
timeout = 0;
} else {
return -4109; // 超时返回错误
return -1; // 超时返回错误
}
i2c_stop_on_bus(I2C0);
printf("device id:%x %x\r\n",data[0],data[1]);
// printf("data[0]: %x, data[1]: %x\r\n", data[0], data[1]);
raw_temp = ((uint16_t) (data[0] << 4) | (data[1]>>4));
// printf("raw_temp: %x\r\n", raw_temp);
// printf("raw_temp(dec): %d\r\n", raw_temp);
temperature = raw_temp * 625;
// printf("temperature: %d\r\n", temperature);
return 0;
}
return temperature;
}

View File

@ -4,6 +4,8 @@
#include "RS485.h"
extern uint32_t g_temperature_uint32;
void RS485_config(void) {
rcu_periph_clock_enable(RS485_GPIO_RCU);
rcu_periph_clock_enable(RS485_RCU);
@ -35,7 +37,8 @@ void process_command(char *cmd) {
if (strncmp(cmd, "M1", 2) == 0) {
printf("M1 -=-=- OK!\r\n");
} else if (strncmp(cmd, "M2", 2) == 0) {
printf("M2 -=-=- OK!\r\n");
// printf("M2 -=-=- OK!\r\n");
printf("Temperature: %lu\r\n", g_temperature_uint32);
// } else if (strncmp(cmd, "M3", 2) == 0) {
// char *param_str = cmd + 2; // Skip "M3"
// int param = atoi(param_str + 1); // Skip "S" and convert to integer

View File

@ -36,6 +36,10 @@ OF SUCH DAMAGE.
#include "main.h"
#include "systick.h"
#include "LDC1612.h"
#include "RS485.h"
char rx_buffer[RX_BUFFER_SIZE];
uint8_t rx_index = 0;
/*!
\brief this function handles NMI exception
@ -140,4 +144,24 @@ void TIMER16_IRQHandler(void) {
}
led_status = !led_status;
}
}
void USART0_IRQHandler(void) {
if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE))
{
usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);
uint8_t received_data = (uint8_t)usart_data_receive(USART0);
// 将接收到的数据存储到缓冲区
if(rx_index < RX_BUFFER_SIZE - 1) {
rx_buffer[rx_index++] = received_data;
}
// 检查是否接收到换行符,表示指令结束
if(received_data == '\n') {
rx_buffer[rx_index] = '\0'; // 添加字符串结束符
process_command(rx_buffer); // 处理指令
rx_index = 0; // 重置缓冲区索引
}
}
}

View File

@ -12,6 +12,8 @@
#include "RS485.h"
#include "LDC1612.h"
uint32_t g_temperature_uint32;
void led_config(void)
{
rcu_periph_clock_enable(LED_RCU);
@ -52,30 +54,18 @@ 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();
LDC1612_read_sensor_infomation();
// I2C_scan();
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);
g_temperature_uint32 = TMP112A_ReadTemperature();
delay_ms(500);
}
}