From bfd2296e0550ebe40b7845bb332a95203e2c85af Mon Sep 17 00:00:00 2001 From: yelvlab Date: Mon, 16 Dec 2024 11:41:26 +0800 Subject: [PATCH] =?UTF-8?q?LDC1612=E5=8D=95=E6=AC=A1=E8=AF=BB=E5=8F=9616bi?= =?UTF-8?q?t=E6=AD=A3=E5=B8=B8=EF=BC=8C=E5=8F=AF=E4=BB=A5=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=8E=82=E5=95=86ID=E6=88=96=E8=80=85=E8=AE=BE?= =?UTF-8?q?=E5=A4=87ID=EF=BC=8C=E4=BD=86=E6=98=AF=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E8=BF=9E=E7=BB=AD=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/LDC1612.h | 2 +- src/LDC1612.c | 16 ++++++------ src/main.c | 72 ++++++++++++++------------------------------------- 3 files changed, 28 insertions(+), 62 deletions(-) diff --git a/inc/LDC1612.h b/inc/LDC1612.h index fb9ff93..891ab9f 100644 --- a/inc/LDC1612.h +++ b/inc/LDC1612.h @@ -58,7 +58,7 @@ typedef enum { void I2C_config(void); void I2C_scan(void); -int LDC1612_IIC_read_16bits(void); +int LDC1612_IIC_read_16bits(uint8_t reg, uint16_t *data); diff --git a/src/LDC1612.c b/src/LDC1612.c index d71ddf7..dc47357 100644 --- a/src/LDC1612.c +++ b/src/LDC1612.c @@ -97,9 +97,7 @@ void I2C_scan(void) { } } -int LDC1612_IIC_read_16bits(void) { - uint8_t data[2] = {0}; - uint16_t raw_temp = 0; +int LDC1612_IIC_read_16bits(uint8_t reg, uint16_t *data) { uint16_t timeout = 0; i2c_ack_config(I2C0, I2C_ACK_ENABLE); @@ -135,13 +133,15 @@ int LDC1612_IIC_read_16bits(void) { while (!i2c_flag_get(I2C0, I2C_FLAG_TBE) && (timeout < I2C_TIME_OUT)) //判断地址是否发送完成,然后发送寄存器地址 timeout++; if (timeout < I2C_TIME_OUT) { - i2c_data_transmit(I2C0, READ_DEVICE_ID); + i2c_data_transmit(I2C0, reg); timeout = 0; // i2c_start_on_bus(I2C0); } else { return -4; // 超时返回错误 } + delay_us(10); + while (i2c_flag_get(I2C0, I2C_FLAG_BTC) && (timeout < I2C_TIME_OUT)) //判断发送缓冲器是否为空,为空后(发送完毕)重新发送开始信号 timeout++; if (timeout < I2C_TIME_OUT) { @@ -175,20 +175,20 @@ int LDC1612_IIC_read_16bits(void) { timeout++; } if (timeout < I2C_TIME_OUT) { - data[0] = i2c_data_receive(I2C0); + *data = i2c_data_receive(I2C0) << 8; timeout = 0; } else { return -8; // 超时返回错误 } - // i2c_ack_config(I2C0, I2C_ACK_DISABLE); // 关闭发送ACK,它会在下一个字节完成后发送NAK + i2c_ack_config(I2C0, I2C_ACK_DISABLE); // 关闭发送ACK,它会在下一个字节完成后发送NAK // 读取第二个字节的数据 while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE) && (timeout < I2C_TIME_OUT)) { timeout++; } if (timeout < I2C_TIME_OUT) { - data[1] = i2c_data_receive(I2C0); + *data |= i2c_data_receive(I2C0); timeout = 0; } else { return -9; // 超时返回错误 @@ -196,6 +196,6 @@ int LDC1612_IIC_read_16bits(void) { i2c_stop_on_bus(I2C0); - printf("device id = %x\r\n", (data[0] <<8 | data[1])); + // printf("device id = %x\r\n", (data[0] <<8 | data[1])); return 0; } \ No newline at end of file diff --git a/src/main.c b/src/main.c index 7374424..b0bf648 100644 --- a/src/main.c +++ b/src/main.c @@ -12,8 +12,7 @@ #include "RS485.h" #include "LDC1612.h" -void led_config(void) -{ +void led_config(void) { rcu_periph_clock_enable(LED_RCU); gpio_mode_set(LED_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED_PIN); @@ -40,8 +39,7 @@ void led_config(void) nvic_irq_enable(LED_IRQ, 2); } -void iicSendData(void) -{ +void iicSendData(void) { while (i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); i2c_start_on_bus(I2C0); printf("1\r\n"); @@ -57,8 +55,7 @@ void iicSendData(void) i2c_start_on_bus(I2C0); } -void iicReceiveData(void) -{ +void iicReceiveData(void) { uint16_t data[3] = {0}; i2c_start_on_bus(I2C0); // i2c_stop_on_bus(I2C0); @@ -91,8 +88,7 @@ void iicReceiveData(void) \param[out] none \retval none */ -int main(void) -{ +int main(void) { /* configure systick */ systick_config(); RS485_config(); @@ -104,63 +100,33 @@ int main(void) printf("XLSW-3DP-LDC1612! V0.0.1\r\n"); printf("\r\n"); - // uint16_t data[3] = {0}; + delay_ms(500); - // I2C_scan(); - - delay_ms(1000); - - // while (i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); - // i2c_start_on_bus(I2C0); - // printf("1\r\n"); - // while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)); - // i2c_master_addressing(I2C0, LDC1612_ADDR, I2C_TRANSMITTER); - // printf("2\r\n"); - // while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); - // i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); - // printf("3\r\n"); - // while (!i2c_flag_get(I2C0, I2C_FLAG_TBE)); - // i2c_data_transmit(I2C0, 0x7E); - // printf("4\r\n"); - // i2c_start_on_bus(I2C0); - // // i2c_stop_on_bus(I2C0); + // int result = 0; + uint16_t data = 0; + uint16_t device_id = 0; + LDC1612_IIC_read_16bits(READ_DEVICE_ID, &data); + // printf("result = %d\r\n", result); - // delay_ms(100); - // i2c_start_on_bus(I2C0); - // delay_ms(100); - // i2c_stop_on_bus(I2C0); + // delay_ms(1000); - // i2c_stop_on_bus(I2C0); - // i2c_ack_config(I2C0, I2C_ACK_ENABLE); - - // iicSendData(); - // iicReceiveData(); - - int result = 0; - result = LDC1612_IIC_read_16bits(); - printf("result = %d\r\n", result); - - while(1){ - + LDC1612_IIC_read_16bits(READ_DEVICE_ID, &device_id); + printf("Manufacturer: 0x%x\r\n", data); + printf("Device: 0x%x\r\n", device_id); + while (1) { delay_ms(1000); printf("OK!!!\r\n"); - // iicSendData(); - - // i2c_flag_clear(I2C0, I2C_FLAG_I2CBSY); - } } /* retarget the C library printf function to the USART */ -int _write (int fd, char *pBuffer, int size) -{ - for (int i = 0; i < size; i++) - { - usart_data_transmit(USART0, (uint8_t)pBuffer[i]); - while(RESET == usart_flag_get(USART0, USART_FLAG_TBE)); +int _write(int fd, char *pBuffer, int size) { + for (int i = 0; i < size; i++) { + usart_data_transmit(USART0, (uint8_t) pBuffer[i]); + while (RESET == usart_flag_get(USART0, USART_FLAG_TBE)); } return size; }