Soft_I2C_Driver/test_project/GD32F303_PRJ/main.c
ArthurCai 8d6fbce170 fix(软件模拟I2C):修改停止信号和起始信号,修改延展计数为用户可设置
1. 修改停止信号函数为void型,且超时不会return
2. 起始信号函数增加时钟延展判断
3. I2C驱动结构体增加延展计数
4. I2C驱动初始化函数增加传参,设置延展计数

Signed-off-by: ArthurCai <arthurcai_c@163.com>
2024-02-01 00:14:23 +08:00

71 lines
1.7 KiB
C

#include "gd32f30x.h"
#include "systick.h"
#include <string.h>
// 引入软件模拟I2C头文件
#include "soft_i2c_dev.h"
void led_init(void) {
rcu_periph_clock_enable(RCU_GPIOC);
gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);
}
void led_on(void) {
gpio_bit_set(GPIOC, GPIO_PIN_13);
}
void led_off(void) {
gpio_bit_reset(GPIOC, GPIO_PIN_13);
}
#define SLAVE_ADDR 0xA0 ///< 从机地址
#define REG_ADDR 0x00 ///< 寄存器地址
uint8_t w_buf[8] = {0xAA, 0xA5, 0x5A, 0xFF, 0xFA, 0xAF, 0xDD, 0xEE};
uint8_t r_buf[8] = {0};
uint8_t flag = 1;
soft_i2c_err_t ret = SOFT_I2C_ERR_OK;
bool equal = false;
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int main(void) {
systick_config();
led_init();
led_on();
// 初始化结构体对象
ret = soft_i2c_init(I2C_DEV, SOFT_I2C_DEFAULT_WAITCNT);
while (1) {
/* turn on LED1 */
led_on();
/* insert 200 ms delay */
delay_1ms(200);
{
memset(r_buf, 0, 8);
if (flag) {
ret = soft_i2c_write(I2C_DEV, SLAVE_ADDR, REG_ADDR, 1, w_buf, 8);
// if (ret != SOFT_I2C_ERR_OK) {
// while(1);
// }
equal = false;
} else {
ret = soft_i2c_read(I2C_DEV, SLAVE_ADDR, REG_ADDR, 1, r_buf, 8);
// if (ret != SOFT_I2C_ERR_OK) {
// while(1);
// }
equal = (memcmp(r_buf, w_buf, 8) == 0) ? true : false;
}
flag = !flag;
}
/* turn off LEDs */
led_off();
/* insert 200 ms delay */
delay_1ms(200);
}
}