diff --git a/Src/i2c.c b/Src/i2c.c index d87a318..c0df70b 100644 --- a/Src/i2c.c +++ b/Src/i2c.c @@ -48,6 +48,7 @@ i2c_result_t i2c_config(void) { return I2C_RESULT_SUCCESS; } +/* wait for SCL to go high, return true if successful, false if timeout */ static bool i2c_wait_scl_high(uint16_t max_wait_time) { while (max_wait_time--) { if (gpio_input_bit_get(I2C_SCL_PORT, I2C_SCL_PIN)) { @@ -167,7 +168,13 @@ void i2c_scan(void) { uint8_t address; int found_devices = 0; - printf("Scanning I2C bus...\r\n"); + // printf("Scanning I2C bus...\r\n"); + const char* msg1 = "Scanning I2C bus...\r\n"; + for (uint8_t i = 0; msg1[i] != '\0'; i++) { + while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} + usart_data_transmit(I2C_DEBUG_UART, msg1[i]); + } + while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TC) == RESET) {} for (address = 1; address < 127; address++) { timeout = 0; @@ -195,7 +202,24 @@ void i2c_scan(void) { timeout++; if (timeout < I2C_TIME_OUT) { i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); - printf("Found device at 0x%02X\r\n", address); + // printf("Found device at 0x%02X\r\n", address); + const char* msg2_prefix = "Found device at 0x"; + for (uint8_t i = 0; msg2_prefix[i] != '\0'; i++) { + while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} + usart_data_transmit(I2C_DEBUG_UART, msg2_prefix[i]); + } + // 发送地址的十六进制表示 + uint8_t hex_chars[] = "0123456789ABCDEF"; + while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} + usart_data_transmit(I2C_DEBUG_UART, hex_chars[(address >> 4) & 0x0F]); + while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} + usart_data_transmit(I2C_DEBUG_UART, hex_chars[address & 0x0F]); + const char* msg2_suffix = "\r\n"; + for (uint8_t i = 0; msg2_suffix[i] != '\0'; i++) { + while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} + usart_data_transmit(I2C_DEBUG_UART, msg2_suffix[i]); + } + while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TC) == RESET) {} found_devices++; } @@ -209,9 +233,33 @@ void i2c_scan(void) { } if (found_devices == 0) { - printf("No I2C devices found.\r\n"); + // printf("No I2C devices found.\r\n"); + const char* msg3 = "No I2C devices found.\r\n"; + for (uint8_t i = 0; msg3[i] != '\0'; i++) { + while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} + usart_data_transmit(I2C_DEBUG_UART, msg3[i]); + } + while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TC) == RESET) {} } else { - printf("Total %d I2C devices found.\r\n", found_devices); + // printf("Total %d I2C devices found.\r\n", found_devices); + const char* msg4_prefix = "Total "; + for (uint8_t i = 0; msg4_prefix[i] != '\0'; i++) { + while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} + usart_data_transmit(I2C_DEBUG_UART, msg4_prefix[i]); + } + // 发送设备数量 + if (found_devices >= 10) { + while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} + usart_data_transmit(I2C_DEBUG_UART, '0' + (found_devices / 10)); + } + while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} + usart_data_transmit(I2C_DEBUG_UART, '0' + (found_devices % 10)); + const char* msg4_suffix = " I2C devices found.\r\n"; + for (uint8_t i = 0; msg4_suffix[i] != '\0'; i++) { + while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} + usart_data_transmit(I2C_DEBUG_UART, msg4_suffix[i]); + } + while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TC) == RESET) {} } } diff --git a/Src/main.c b/Src/main.c index bb5adba..ea592b6 100644 --- a/Src/main.c +++ b/Src/main.c @@ -73,16 +73,15 @@ int main(void) #endif -#ifdef DEBUG_VERBOSE i2c_config(); +#ifdef DEBUG_VERBOSE i2c_scan(); i2c_bus_reset(); - - i2c_scan(); #endif + i2c_scan(); ldc1612_iic_get_sensor_infomation(); diff --git a/i2c_wait.c b/i2c_wait.c index 8ed86df..17aa538 100644 --- a/i2c_wait.c +++ b/i2c_wait.c @@ -8,215 +8,6 @@ /* Private variables */ static uint8_t i2c_retry_count = 0; -/*! - \brief configure the GPIO ports - \param[in] none - \param[out] none - \retval none -*/ -void i2c_gpio_config(void) { - /* enable IIC GPIO clock */ - rcu_periph_clock_enable(RCU_GPIO_I2C); - - /* connect I2C_SCL_PIN to I2C_SCL */ - gpio_af_set(I2C_SCL_PORT, I2C_GPIO_AF, I2C_SCL_PIN); - /* connect I2C_SDA_PIN to I2C_SDA */ - gpio_af_set(I2C_SDA_PORT, I2C_GPIO_AF, I2C_SDA_PIN); - /* configure GPIO pins of I2C */ - gpio_mode_set(I2C_SCL_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, I2C_SCL_PIN); - gpio_output_options_set(I2C_SCL_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SCL_PIN); - 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); -} - -/*! - \brief configure the I2CX interface - \param[in] none - \param[out] none - \retval i2c_status_t -*/ -i2c_status_t i2c_config(void) { - /* configure I2C GPIO */ - i2c_gpio_config(); - - /* enable I2C clock */ - rcu_periph_clock_enable(RCU_I2C); - - /* configure I2C clock */ - i2c_clock_config(I2C0, I2C_SPEED, I2C_DTCY_2); - - /* configure I2C address - use 0x00 as master doesn't need specific address */ - i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C_MASTER_ADDRESS); - - /* enable I2CX */ - i2c_enable(I2C0); - - /* enable acknowledge */ - i2c_ack_config(I2C0, I2C_ACK_ENABLE); - - /* reset retry counter */ - i2c_retry_count = 0; - - return I2C_STATUS_SUCCESS; -} - -/*! - \brief reset I2C bus with proper 9-clock recovery - \param[in] none - \param[out] none - \retval i2c_status_t -*/ -i2c_status_t i2c_bus_reset(void) { - uint8_t i; - - /* disable I2C peripheral */ - i2c_disable(I2C0); - i2c_deinit(I2C0); - - /* configure SDA/SCL as GPIO output for manual control */ - gpio_mode_set(I2C_SCL_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, I2C_SCL_PIN); - gpio_mode_set(I2C_SDA_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, I2C_SDA_PIN); - gpio_output_options_set(I2C_SCL_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SCL_PIN); - gpio_output_options_set(I2C_SDA_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SDA_PIN); - - /* ensure both lines are high initially */ - gpio_bit_set(I2C_SCL_PORT, I2C_SCL_PIN); - gpio_bit_set(I2C_SDA_PORT, I2C_SDA_PIN); - delay_10us(I2C_DELAY_10US); - - /* generate 9 clock pulses to release any stuck slave */ - for (i = 0; i < I2C_RECOVERY_CLOCKS; i++) { - gpio_bit_reset(I2C_SCL_PORT, I2C_SCL_PIN); - delay_10us(I2C_DELAY_10US); - gpio_bit_set(I2C_SCL_PORT, I2C_SCL_PIN); - delay_10us(I2C_DELAY_10US); - } - - /* generate stop condition */ - gpio_bit_reset(I2C_SDA_PORT, I2C_SDA_PIN); - delay_10us(I2C_DELAY_10US); - gpio_bit_set(I2C_SCL_PORT, I2C_SCL_PIN); - delay_10us(I2C_DELAY_10US); - gpio_bit_set(I2C_SDA_PORT, I2C_SDA_PIN); - delay_10us(I2C_DELAY_10US); - - /* reconfigure as I2C pins */ - gpio_af_set(I2C_SCL_PORT, I2C_GPIO_AF, I2C_SCL_PIN); - gpio_af_set(I2C_SDA_PORT, I2C_GPIO_AF, I2C_SDA_PIN); - gpio_mode_set(I2C_SCL_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, I2C_SCL_PIN); - gpio_mode_set(I2C_SDA_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, I2C_SDA_PIN); - - /* reconfigure the I2CX interface */ - return i2c_config(); -} - -/** - * @brief 扫描I2C总线,查找连接的设备 - * - * 该函数会扫描I2C总线上的所有地址(1到126),并尝试与每个地址进行通信。 - * 如果在某个地址上发现了设备,则会打印出该设备的地址。 - * 最后会打印出找到的设备总数。 - */ -void i2c_scan(void) { - uint32_t timeout; - uint8_t address; - int found_devices = 0; - - // printf("Scanning I2C bus...\r\n"); - const char* msg1 = "Scanning I2C bus...\r\n"; - for (uint8_t i = 0; msg1[i] != '\0'; i++) { - while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} - usart_data_transmit(I2C_DEBUG_UART, msg1[i]); - } - while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TC) == RESET) {} - - for (address = 1; address < 127; address++) { - timeout = 0; - - // 生成起始条件 - while (i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - continue; // 超时,跳过该地址 - } - i2c_start_on_bus(I2C0); - timeout = 0; - - // 等待起始条件发送完成 - while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout >= I2C_TIME_OUT) { - continue; // 超时,跳过该地址 - } - i2c_master_addressing(I2C0, (address << 1), I2C_TRANSMITTER); - timeout = 0; - - // 等待地址发送完成 - while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) && (timeout < I2C_TIME_OUT)) - timeout++; - if (timeout < I2C_TIME_OUT) { - i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); - // printf("Found device at 0x%02X\r\n", address); - const char* msg2_prefix = "Found device at 0x"; - for (uint8_t i = 0; msg2_prefix[i] != '\0'; i++) { - while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} - usart_data_transmit(I2C_DEBUG_UART, msg2_prefix[i]); - } - // 发送地址的十六进制表示 - uint8_t hex_chars[] = "0123456789ABCDEF"; - while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} - usart_data_transmit(I2C_DEBUG_UART, hex_chars[(address >> 4) & 0x0F]); - while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} - usart_data_transmit(I2C_DEBUG_UART, hex_chars[address & 0x0F]); - const char* msg2_suffix = "\r\n"; - for (uint8_t i = 0; msg2_suffix[i] != '\0'; i++) { - while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} - usart_data_transmit(I2C_DEBUG_UART, msg2_suffix[i]); - } - while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TC) == RESET) {} - found_devices++; - } - - // 生成停止条件 - i2c_stop_on_bus(I2C0); - - timeout = 0; - - while ((I2C_CTL0(I2C0) & I2C_CTL0_STOP) && (timeout < I2C_TIME_OUT)) - timeout++; - } - - if (found_devices == 0) { - // printf("No I2C devices found.\r\n"); - const char* msg3 = "No I2C devices found.\r\n"; - for (uint8_t i = 0; msg3[i] != '\0'; i++) { - while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} - usart_data_transmit(I2C_DEBUG_UART, msg3[i]); - } - while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TC) == RESET) {} - } else { - // printf("Total %d I2C devices found.\r\n", found_devices); - const char* msg4_prefix = "Total "; - for (uint8_t i = 0; msg4_prefix[i] != '\0'; i++) { - while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} - usart_data_transmit(I2C_DEBUG_UART, msg4_prefix[i]); - } - // 发送设备数量 - if (found_devices >= 10) { - while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} - usart_data_transmit(I2C_DEBUG_UART, '0' + (found_devices / 10)); - } - while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} - usart_data_transmit(I2C_DEBUG_UART, '0' + (found_devices % 10)); - const char* msg4_suffix = " I2C devices found.\r\n"; - for (uint8_t i = 0; msg4_suffix[i] != '\0'; i++) { - while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TBE) == RESET) {} - usart_data_transmit(I2C_DEBUG_UART, msg4_suffix[i]); - } - while (usart_flag_get(I2C_DEBUG_UART, USART_FLAG_TC) == RESET) {} - } -} - /*! \brief write 16-bit data to I2C device with improved state machine \param[in] slave_addr: 7-bit slave address