144 lines
4.5 KiB
C
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
|
|
|