phy6222 IIC从机配置
一、IIC从机初始化配置
void user_iic_slave_init(void)
{
hal_gpio_pin_init(P33, IE);
hal_gpio_pin_init(P34, IE);
hal_gpio_pull_set(P33, STRONG_PULL_UP);
hal_gpio_pull_set(P34, STRONG_PULL_UP);
uint8_t op_ret = 0;
I2C_Slave_Parameter iic_slave_cfg;
iic_slave_cfg.id = 0;
iic_slave_cfg.workmode = Slave;
iic_slave_cfg.AddressMode = I2C_ADDR_7bit;
iic_slave_cfg.RX_FIFO_Len = 3;
iic_slave_cfg.Tx_FIFO_Len = 3;
iic_slave_cfg.SDA_PIN = P33;
iic_slave_cfg.SCL_PIN = P34;
iic_slave_cfg.Slave_Address = BLE_LOCK_IIC_ADDRESS;
iic_slave_cfg.IRQ_Source = I2C_MASK_RD_REQ | I2C_MASK_RX_FULL; //(I2C_MASK_TX_ABRT | I2C_MASK_RD_REQ | I2C_MASK_RX_DONE | I2C_MASK_RX_FULL); //
iic_slave_cfg.evt_handler = __iic_slave_evt;
op_ret = Hal_I2C_Slave_Init(&iic_slave_cfg, &iic_id);
if (0 != op_ret) {
LOG("iic slave init false!");
return;
}
// LOG("iic slave init sucess!");
// Hal_I2c_Slave_Open(iic_id);
}
二、IIC中断处理函数
static void __iic_slave_evt(I2C_Evt_t *pev)
{
// LOG("type:%d, len:%d\r\n", pev->type, pev->len);
// Hal_I2C_Slave_CLR_IRQs(iic_id, pev->type);
for (uint8_t i = 0; i < 16; i++){
if (pev->type& (0x0001 << i)) {
Hal_I2C_Slave_CLR_IRQs(iic_id, 0x0001 << i);
if (5 == i) {
Hal_I2C_Slave_WriteTX_FIFO(iic_id, &test_data, 1);
// LOG("send test_data:%d\r\n", test_data);
// Hal_I2c_Slave_Open(iic_id);
} else if (2 == i) {
Hal_I2C_Slave_ReadRX_FIFO(iic_id, iic_data, 1);
if (iic_data[0] == 0xaa) {
Hal_I2C_Slave_Deinit(&iic_id);
user_iic_slave_init();
}
// LOG("iic_data:%d\r\n", iic_data[0]);
}
}
// LOG("data[%d]:%d", i, pev->data[i]);
}
}
PS:当IIC中断信号为I2C_MASK_RX_FULL,需要使用iic从机数据获取的函数(Hal_I2C_Slave_ReadRX_FIFO)来清除中断信号,使用iic中断清除函数(Hal_I2C_Slave_CLR_IRQs)无法清除改中断信号
三、中断向量表需要添加IIC中断入口
在jump_table.c文件的jump_table_base[256]中断数组中添加中断入口函数