用gd32e230的stdlib重写wbh的参考代码,并因为stm的stdlib和gd32的stdlib有很大差异,超时机制与flag验证差异较大,通过对比重新编写。
数据计算方式重新书写,两个8位数据的合并方式修改为位移,并且整体放大100倍(标准数据为((Data[1] << 8) | Data[0]) * 0.02 - 273.15)
This commit is contained in:
parent
be81eb0c2e
commit
485122c6df
@ -20,7 +20,7 @@ set(TARGET_C_SRC
|
|||||||
${CMAKE_SOURCE_DIR}/src/systick.c
|
${CMAKE_SOURCE_DIR}/src/systick.c
|
||||||
${CMAKE_SOURCE_DIR}/src/ultrasonic_driver.c
|
${CMAKE_SOURCE_DIR}/src/ultrasonic_driver.c
|
||||||
${CMAKE_SOURCE_DIR}/src/mlx90614.c
|
${CMAKE_SOURCE_DIR}/src/mlx90614.c
|
||||||
${CMAKE_SOURCE_DIR}/src/gd32e23x_hw_i2c.c
|
# ${CMAKE_SOURCE_DIR}/src/gd32e23x_hw_i2c.c
|
||||||
)
|
)
|
||||||
|
|
||||||
add_executable(xlsw_3dp_ultrasonic_300K ${TARGET_C_SRC})
|
add_executable(xlsw_3dp_ultrasonic_300K ${TARGET_C_SRC})
|
||||||
|
@ -5,7 +5,10 @@
|
|||||||
#ifndef MLX90614_H
|
#ifndef MLX90614_H
|
||||||
#define MLX90614_H
|
#define MLX90614_H
|
||||||
|
|
||||||
#define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)(I2C_FLAG_I2CBSY | I2C_FLAG_MASTER | I2C_FLAG_RBNE))
|
// #define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)(I2C_FLAG_I2CBSY | I2C_FLAG_MASTER | I2C_FLAG_RBNE))
|
||||||
|
#define SLAVE_ADDR (0x5A << 1)
|
||||||
|
#define REG_ADDR_OBJ_TEMP 0x07
|
||||||
|
#define REG_ADDR_AMB_TEMP 0x06
|
||||||
|
|
||||||
void i2c_config(void);
|
void i2c_config(void);
|
||||||
int read_ir_mlx90614(void);
|
int read_ir_mlx90614(void);
|
||||||
|
@ -55,6 +55,8 @@ int main(void)
|
|||||||
const char* result = (capture_value <= CAPTURE_VALUE_MAX) ? "Distance: %d\n" : "Over Range\n";
|
const char* result = (capture_value <= CAPTURE_VALUE_MAX) ? "Distance: %d\n" : "Over Range\n";
|
||||||
distance_uint16 = calculate_distance(capture_value);
|
distance_uint16 = calculate_distance(capture_value);
|
||||||
printf(result, distance_uint16);
|
printf(result, distance_uint16);
|
||||||
|
|
||||||
|
printf("Temp:%d", read_ir_mlx90614());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
138
src/mlx90614.c
138
src/mlx90614.c
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
void i2c_config(void) {
|
void i2c_config(void) {
|
||||||
rcu_periph_clock_enable(RCU_I2C0);
|
rcu_periph_clock_enable(RCU_I2C0);
|
||||||
rcu_periph_clock_enable(GPIOF);
|
rcu_periph_clock_enable(RCU_GPIOF);
|
||||||
|
|
||||||
gpio_af_set(GPIOF, GPIO_AF_1, GPIO_PIN_0 | GPIO_PIN_1);
|
gpio_af_set(GPIOF, GPIO_AF_1, GPIO_PIN_0 | GPIO_PIN_1);
|
||||||
gpio_output_options_set(GPIOF, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1);
|
gpio_output_options_set(GPIOF, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1);
|
||||||
@ -27,6 +27,7 @@ int read_ir_mlx90614(void) {
|
|||||||
uint8_t Data[5];
|
uint8_t Data[5];
|
||||||
int inttemp_ir = 0;
|
int inttemp_ir = 0;
|
||||||
uint32_t TIMEOUT = 0;
|
uint32_t TIMEOUT = 0;
|
||||||
|
// while(TIMEOUT<10000&&I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY))
|
||||||
while (TIMEOUT < 10000 && i2c_flag_get(I2C0, I2C_FLAG_I2CBSY))
|
while (TIMEOUT < 10000 && i2c_flag_get(I2C0, I2C_FLAG_I2CBSY))
|
||||||
TIMEOUT++;
|
TIMEOUT++;
|
||||||
if (TIMEOUT >= 10000) {
|
if (TIMEOUT >= 10000) {
|
||||||
@ -37,7 +38,17 @@ int read_ir_mlx90614(void) {
|
|||||||
// I2C_GenerateSTART(I2C0, ENABLE);
|
// I2C_GenerateSTART(I2C0, ENABLE);
|
||||||
i2c_start_on_bus(I2C0);
|
i2c_start_on_bus(I2C0);
|
||||||
// while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_MODE_SELECT))
|
// while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_MODE_SELECT))
|
||||||
while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_EVENT_MASTER_MODE_SELECT))
|
/* 等待发送模式
|
||||||
|
* I2C_EVENT_MASTER_MODE_SELECT --> BUSY, MSL and SB flags
|
||||||
|
* ||
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_MASTER) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_SBSEND)
|
||||||
|
*/
|
||||||
|
while (TIMEOUT < 10000
|
||||||
|
&& !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)
|
||||||
|
&& !i2c_flag_get(I2C0, I2C_FLAG_MASTER)
|
||||||
|
&& !i2c_flag_get(I2C0, I2C_FLAG_SBSEND))
|
||||||
TIMEOUT++;
|
TIMEOUT++;
|
||||||
if (TIMEOUT >= 10000) {
|
if (TIMEOUT >= 10000) {
|
||||||
//printf("ERROR1\r\n");
|
//printf("ERROR1\r\n");
|
||||||
@ -46,27 +57,64 @@ int read_ir_mlx90614(void) {
|
|||||||
// I2C_AcknowledgeConfig(I2C0,DISABLE);
|
// I2C_AcknowledgeConfig(I2C0,DISABLE);
|
||||||
TIMEOUT = 0;
|
TIMEOUT = 0;
|
||||||
// I2C_Send7bitAddress(I2C0, 0XB4, I2C_Direction_Transmitter);
|
// I2C_Send7bitAddress(I2C0, 0XB4, I2C_Direction_Transmitter);
|
||||||
i2c_master_addressing(I2C0, 0XB4, I2C_TRANSMITTER);
|
i2c_master_addressing(I2C0, SLAVE_ADDR, I2C_TRANSMITTER);
|
||||||
// while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
|
// while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
|
||||||
while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_FLAG_TR))
|
/* 等待发送地址完成
|
||||||
|
* I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED --> BUSY, MSL, ADDR, TXE and TRA flags
|
||||||
|
* ||
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_MASTER) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_TBE) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_TR)
|
||||||
|
*/
|
||||||
|
while (TIMEOUT < 10000 &&
|
||||||
|
!i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) &&
|
||||||
|
!i2c_flag_get(I2C0, I2C_FLAG_MASTER) &&
|
||||||
|
!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) &&
|
||||||
|
!i2c_flag_get(I2C0, I2C_FLAG_TBE) &&
|
||||||
|
!i2c_flag_get(I2C0, I2C_FLAG_TR))
|
||||||
TIMEOUT++;
|
TIMEOUT++;
|
||||||
if (TIMEOUT >= 10000) {
|
if (TIMEOUT >= 10000) {
|
||||||
printf("ERROR2\r\n");
|
printf("ERROR2\r\n");
|
||||||
return -410;
|
return -410;
|
||||||
}
|
}
|
||||||
I2C_SendData(I2C0, 0x07);
|
// I2C_SendData(I2C0, 0x07);
|
||||||
|
i2c_data_transmit(I2C0, REG_ADDR_OBJ_TEMP);
|
||||||
|
|
||||||
TIMEOUT = 0;
|
TIMEOUT = 0;
|
||||||
I2C_GenerateSTART(I2C0, ENABLE);
|
// I2C_GenerateSTART(I2C0, ENABLE);
|
||||||
while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_MODE_SELECT))
|
i2c_start_on_bus(I2C0);
|
||||||
|
// while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_MODE_SELECT))
|
||||||
|
/* 等待发送模式
|
||||||
|
* I2C_EVENT_MASTER_MODE_SELECT --> BUSY, MSL and SB flags
|
||||||
|
* ||
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_MASTER) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_SBSEND)
|
||||||
|
*/
|
||||||
|
while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)
|
||||||
|
&& !i2c_flag_get(I2C0, I2C_FLAG_MASTER)
|
||||||
|
&& !i2c_flag_get(I2C0, I2C_FLAG_SBSEND))
|
||||||
TIMEOUT++;
|
TIMEOUT++;
|
||||||
if (TIMEOUT >= 10000) {
|
if (TIMEOUT >= 10000) {
|
||||||
//printf("ERROR3\r\n");
|
//printf("ERROR3\r\n");
|
||||||
return -410;
|
return -410;
|
||||||
}
|
}
|
||||||
TIMEOUT = 0;
|
TIMEOUT = 0;
|
||||||
I2C_Send7bitAddress(I2C0, 0XB4, I2C_Direction_Receiver);
|
// I2C_Send7bitAddress(I2C0, 0XB4, I2C_Direction_Receiver);
|
||||||
while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED))
|
i2c_master_addressing(I2C0, SLAVE_ADDR, I2C_RECEIVER);
|
||||||
|
// while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED))
|
||||||
|
/* 等待接收完成
|
||||||
|
* I2C_EVENT_MASTER_BYTE_RECEIVED --> BUSY, MSL, RXNE flags
|
||||||
|
* ||
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_MASTER) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_RBNE)
|
||||||
|
*/
|
||||||
|
while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)
|
||||||
|
&& !i2c_flag_get(I2C0, I2C_FLAG_MASTER)
|
||||||
|
&& !i2c_flag_get(I2C0, I2C_FLAG_RBNE))
|
||||||
TIMEOUT++;
|
TIMEOUT++;
|
||||||
if (TIMEOUT >= 10000) {
|
if (TIMEOUT >= 10000) {
|
||||||
//printf("ERROR4\r\n");
|
//printf("ERROR4\r\n");
|
||||||
@ -74,8 +122,19 @@ int read_ir_mlx90614(void) {
|
|||||||
}
|
}
|
||||||
//I2C_AcknowledgeConfig(I2C0,DISABLE);
|
//I2C_AcknowledgeConfig(I2C0,DISABLE);
|
||||||
TIMEOUT = 0;
|
TIMEOUT = 0;
|
||||||
Data[0] = I2C_ReceiveData(I2C0);
|
// Data[0] = I2C_ReceiveData(I2C0);
|
||||||
while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED))
|
Data[0] = i2c_data_receive(I2C0);
|
||||||
|
// while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED))
|
||||||
|
/* 等待接收完成
|
||||||
|
* I2C_EVENT_MASTER_BYTE_RECEIVED --> BUSY, MSL, RXNE flags
|
||||||
|
* ||
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_MASTER) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_RBNE)
|
||||||
|
*/
|
||||||
|
while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)
|
||||||
|
&& !i2c_flag_get(I2C0, I2C_FLAG_MASTER)
|
||||||
|
&& !i2c_flag_get(I2C0, I2C_FLAG_RBNE))
|
||||||
TIMEOUT++;
|
TIMEOUT++;
|
||||||
if (TIMEOUT >= 10000) {
|
if (TIMEOUT >= 10000) {
|
||||||
//printf("ERROR5\r\n");
|
//printf("ERROR5\r\n");
|
||||||
@ -83,8 +142,19 @@ int read_ir_mlx90614(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TIMEOUT = 0;
|
TIMEOUT = 0;
|
||||||
Data[1] = I2C_ReceiveData(I2C0);
|
// Data[1] = I2C_ReceiveData(I2C0);
|
||||||
while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED))
|
Data[1] = i2c_data_receive(I2C0);
|
||||||
|
// while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED))
|
||||||
|
/* 等待接收完成
|
||||||
|
* I2C_EVENT_MASTER_BYTE_RECEIVED --> BUSY, MSL, RXNE flags
|
||||||
|
* ||
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_MASTER) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_RBNE)
|
||||||
|
*/
|
||||||
|
while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)
|
||||||
|
&& !i2c_flag_get(I2C0, I2C_FLAG_MASTER)
|
||||||
|
&& !i2c_flag_get(I2C0, I2C_FLAG_RBNE))
|
||||||
TIMEOUT++;
|
TIMEOUT++;
|
||||||
if (TIMEOUT >= 10000) {
|
if (TIMEOUT >= 10000) {
|
||||||
//printf("ERROR6\r\n");
|
//printf("ERROR6\r\n");
|
||||||
@ -92,8 +162,19 @@ int read_ir_mlx90614(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TIMEOUT = 0;
|
TIMEOUT = 0;
|
||||||
Data[2] = I2C_ReceiveData(I2C0);
|
// Data[2] = I2C_ReceiveData(I2C0);
|
||||||
while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED))
|
Data[2] = i2c_data_receive(I2C0);
|
||||||
|
// while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED))
|
||||||
|
/* 等待接收完成
|
||||||
|
* I2C_EVENT_MASTER_BYTE_RECEIVED --> BUSY, MSL, RXNE flags
|
||||||
|
* ||
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_MASTER) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_RBNE)
|
||||||
|
*/
|
||||||
|
while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)
|
||||||
|
&& !i2c_flag_get(I2C0, I2C_FLAG_MASTER)
|
||||||
|
&& !i2c_flag_get(I2C0, I2C_FLAG_RBNE))
|
||||||
TIMEOUT++;
|
TIMEOUT++;
|
||||||
if (TIMEOUT >= 10000) {
|
if (TIMEOUT >= 10000) {
|
||||||
//printf("ERROR7\r\n");
|
//printf("ERROR7\r\n");
|
||||||
@ -101,9 +182,21 @@ int read_ir_mlx90614(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
I2C_AcknowledgeConfig(I2C0, DISABLE);
|
// I2C_AcknowledgeConfig(I2C0, DISABLE);
|
||||||
Data[3] = I2C_ReceiveData(I2C0);
|
i2c_ack_config(I2C0, I2C_ACK_DISABLE);
|
||||||
while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED))
|
// Data[3] = I2C_ReceiveData(I2C0);
|
||||||
|
Data[3] = i2c_data_receive(I2C0);
|
||||||
|
// while (TIMEOUT < 10000 && !I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_BYTE_RECEIVED))
|
||||||
|
/* 等待接收完成
|
||||||
|
* I2C_EVENT_MASTER_BYTE_RECEIVED --> BUSY, MSL, RXNE flags
|
||||||
|
* ||
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_MASTER) &&
|
||||||
|
* !i2c_flag_get(I2C0, I2C_FLAG_RBNE)
|
||||||
|
*/
|
||||||
|
while (TIMEOUT < 10000 && !i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)
|
||||||
|
&& !i2c_flag_get(I2C0, I2C_FLAG_MASTER)
|
||||||
|
&& !i2c_flag_get(I2C0, I2C_FLAG_RBNE))
|
||||||
TIMEOUT++;
|
TIMEOUT++;
|
||||||
if (TIMEOUT >= 10000) {
|
if (TIMEOUT >= 10000) {
|
||||||
//printf("ERROR11\r\n");
|
//printf("ERROR11\r\n");
|
||||||
@ -111,10 +204,13 @@ int read_ir_mlx90614(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
I2C_GenerateSTOP(I2C0, ENABLE);
|
// I2C_GenerateSTOP(I2C0, ENABLE);
|
||||||
I2C_AcknowledgeConfig(I2C0, ENABLE);
|
i2c_stop_on_bus(I2C0);
|
||||||
|
// I2C_AcknowledgeConfig(I2C0, ENABLE);
|
||||||
|
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
|
||||||
//printf("data:%x,%x,%x\r\n",Data[0],Data[1],Data[2]);
|
//printf("data:%x,%x,%x\r\n",Data[0],Data[1],Data[2]);
|
||||||
inttemp_ir = (int) ((Data[0] + Data[1] * 255) * 0.2 - 2731.5);
|
// inttemp_ir = (int) ((Data[0] + Data[1] * 255) * 0.2 - 2731.5);
|
||||||
|
inttemp_ir = (((Data[1] << 8) | Data[0]) * 2 - 27315);
|
||||||
// printf("temp:%d\r\n",inttemp_ir);
|
// printf("temp:%d\r\n",inttemp_ir);
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user