Files
2025-12-03 11:12:34 +08:00

144 lines
4.5 KiB
C

#ifdef SUPPORT_MS_EXTENSIONS
#pragma bss_seg(".iic_slave_demo.data.bss")
#pragma data_seg(".iic_slave_demo.data")
#pragma const_seg(".iic_slave_demo.text.const")
#pragma code_seg(".iic_slave_demo.text")
#endif
#include "iic_api.h"
#include "clock.h"
#include "asm/wdt.h"
#define LOG_TAG "[iic_s_demo]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
#define LOG_CLI_ENABLE
#include "debug.h"
#if 1
#define IIC_SCL_IO IO_PORTA_02
#define IIC_SDA_IO IO_PORTA_03
/******************************hw iic slave test*****************************/
u8 slave_tx_buf_test[250];
u8 slave_rx_buf_test[255];
#define IIC_SLAVE_INDEX HW_IIC_0
//rx协议:start,addr write,data0,data1,,,,,,stop
//tx协议:start,addr read,data0,data1,,,,,nack,stop
//tx协议:start,addr write,regx,start,addr read,data0,data1,,,,,nack,stop(v1不支持该模式)
AT(.iic.text.cache.L1)
void hw_iic_isr_fun_test()//slave test
{
static int rx_state = 0, tx_cnt = 0, rx_cnt = 1;
u8 iic = IIC_SLAVE_INDEX;
#if defined CONFIG_IIC_VERSION2
if ((hw_iic_get_pnd(iic, I2C_PND_START)) || (hw_iic_get_pnd(iic, I2C_PND_ADR_MATCH))) {
#else
if (rx_state == 0) {
#endif
rx_state = hw_iic_slave_rx_byte(iic, &slave_rx_buf_test[0]);//addr
if (rx_state == IIC_SLAVE_RX_ADDR_RX) { //rx
hw_iic_slave_rx_prepare(iic, 1, 0);
} else if (rx_state == IIC_SLAVE_RX_ADDR_TX) { //tx
//准备数据并发送(不能耗时太久)
hw_iic_slave_tx_byte(iic, slave_tx_buf_test[tx_cnt++]);
} else { //error
log_error("iic slave rx addr error!\n");
rx_state = 0;
hw_iic_slave_rx_prepare(iic, 0, 0);
}
return;
}
if (hw_iic_get_pnd(iic, I2C_PND_STOP)) {
/* putchar('e'); */
hw_iic_clr_all_pnd(iic);
hw_iic_slave_rx_prepare(iic, 0, 0);
if (rx_state >= IIC_SLAVE_RX_ADDR_RX) { //rx
log_info_hexdump(slave_rx_buf_test, rx_cnt);
}
rx_state = 0;
tx_cnt = 0;
rx_cnt = 1;
return;
}
if (hw_iic_get_pnd(iic, I2C_PND_TASK_DONE)) {
if (rx_state == 0) { //error
hw_iic_clr_all_pnd(iic);
hw_iic_slave_rx_prepare(iic, 0, 0);
} else if (rx_state == IIC_SLAVE_RX_ADDR_TX) { //tx
if (hw_iic_slave_tx_check_ack(iic) == 0) { //no ack
return;
}
hw_iic_slave_tx_byte(iic, slave_tx_buf_test[tx_cnt++]);
} else if (rx_state >= IIC_SLAVE_RX_ADDR_RX) { //rx
hw_iic_slave_rx_byte(iic, &slave_rx_buf_test[rx_cnt++]);
hw_iic_slave_rx_prepare(iic, 1, 0);
}
}
}
void hw_iic_slave_polling_test()
{
struct hw_iic_slave_config hw_iic_config_test = {
.config.role = IIC_SLAVE,
.config.scl_io = IIC_SCL_IO + IIC_SLAVE_INDEX,
.config.sda_io = IIC_SDA_IO + IIC_SLAVE_INDEX,
.config.io_mode = PORT_INPUT_PULLUP_10K,//上拉或浮空
.config.hdrive = PORT_DRIVE_STRENGT_2p4mA, //enum GPIO_HDRIVE 0:2.4MA, 1:8MA, 2:26.4MA, 3:40MA
.config.ie_en = 0,
.config.irq_priority = 3,
.config.io_filter = 1,
.slave_addr = 0x68,
.iic_slave_irq_func = NULL,
};
for (u16 i = 0; i < sizeof(slave_rx_buf_test); i++) {
slave_rx_buf_test[i] = 0;
}
for (u8 i = 0; i < sizeof(slave_tx_buf_test); i++) {
slave_tx_buf_test[i] = i;
}
//ie
#if 0//ie test
hw_iic_config_test.config.ie_en = 1;
hw_iic_config_test.iic_slave_irq_func = hw_iic_isr_fun_test;
enum iic_state_enum iic_init_state1 = hw_iic_slave_init(IIC_SLAVE_INDEX, &hw_iic_config_test);
if (iic_init_state1 == IIC_OK) {
log_info("iic%d_slave init ok", IIC_SLAVE_INDEX);
}
while (1) {
wdt_clear();
mdelay(1000);
}
#endif
//polling
enum iic_state_enum iic_init_state = hw_iic_slave_init(IIC_SLAVE_INDEX, &hw_iic_config_test);
if (iic_init_state == IIC_OK) {
log_info("iic%d_slave init ok", IIC_SLAVE_INDEX);
}
/* JL_PORTB->DIR &= ~BIT(3);//test io */
/* JL_PORTB->OUT &= ~BIT(3); */
#if 0//rx test
while (1) {
hw_iic_slave_polling_rx(IIC_SLAVE_INDEX, slave_rx_buf_test);
wdt_clear();
}
#else//tx test
while (1) {
log_info("------------iic%d slave polling tx test------------\n", IIC_SLAVE_INDEX);
if (hw_iic_slave_polling_tx(IIC_SLAVE_INDEX, slave_tx_buf_test)) {
log_info("iic%d slave tx ok\n", IIC_SLAVE_INDEX);
} else {
log_info("iic%d slave tx fail\n", IIC_SLAVE_INDEX);
}
wdt_clear();
}
#endif
}
#endif