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]中断数组中添加中断入口函数