大家好,
我已经检查过这个问题,但没有找到任何帖子。
我试图使用中断模式使 LPC1125 在 I2C 上作为从属设备工作,但我做不到。当程序运行时,当我尝试连接时它不会触发 ISR。
基于提供的示例
periph_i2c我将我的 init (使用提供的
lpc_chip_112x)写为:
void Init_I2C_Slave(void){
/* Set the I2C inputs as standard mode*/
Chip_IOCON_PinMuxSet(LPC_IOCON, IOCON_PIO0_4, IOCON_FUNC1);
Chip_IOCON_PinMuxSet(LPC_IOCON, IOCON_PIO0_5, IOCON_FUNC1);
/* Init I2C module */
Chip_I2C_Init(I2C0);
/* Set the clock rate for the I2C peripheral */
Chip_I2C_SetClockRate(I2C0, I2C_DEFAULT_SPEED);
/* Set the I2C mode to interrupt*/
Chip_I2C_SetMasterEventHandler(I2C0, Chip_I2C_EventHandler);
/* Configure the I2C parameters */
dev_xfer.slaveAddr = (I2C_SLAVE_ADDR << 1);
dev_xfer.rxBuff = &g_comm.rxBuff;
dev_xfer.rxSz = sizeof(g_comm.rxBuff);
dev_xfer.txBuff = &g_comm.txBuff;
dev_xfer.txSz = sizeof(g_comm.txBuff);
Chip_I2C_SlaveSetup(I2C0, I2C_SLAVE_0, &g_comm, I2C_Events, 0);
}
我的事件函数定义为:
sta
tic void I2C_Events(I2C_ID_T id, I2C_EVENT_T event){
switch(event){
case I2C_EVENT_DONE:
printf("I2C done event
");
printf("%i
", g_comm.rxBuff);
// update size
printf("
");
break;
case I2C_EVENT_SLAVE_RX:
printf("I2C receive event
");
printf("%i
", g_comm.rxBuff);
printf("
");
break;
case I2C_EVENT_SLAVE_TX:
printf("I2C transmit event
");
printf("%i
", g_comm.txBuff);
printf("
");
break;
}
}
我的交换数据结构在全球范围内定义(以在整个程序中共享数据)为:
/* Global communication structure */
typedef struct {
uint8_t rxBuff;
uint8_t txBuff;
}g_comm_t;
g_comm_t g_comm;
最后我的 IRQ 处理程序定义为:
/**
* @brief I2C Interrupt Handler
* @return None
*/
void I2C_IRQHandler(void)
{
Chip_I2C_SlaveStateHandler(I2C0);
}
当然,在我的
main中,我调用了 init 并且我也启用了 NVIC:
/* Init the I2C module as slave */
Init_I2C_Slave();
/* Enable the I2C NVIC interrupt */
NVIC_EnableIRQ(I2C0_IRQn);我的问题是:
我的Init_I2C_Slave例程的功能是否以正确的顺序执行?
在从
接收器模式(第 101 页)的设备用户手册(rev1.0)中写道,要将 I2C 模块初始化为从接收器,我必须写入
从地址寄存器并写入
I2C 控制设置寄存器,如下所示:
但是,如果您查看 Chip_I2C_Init,
它的实现如下:
{
enableClk(id);
/* Bring I2C out of reset */
Chip_SYSCON_PeriphReset(RESET_I2C0);
/* Set I2C operation to default */
LPC_I2Cx(id)->CONCLR = (I2C_CON_AA | I2C_CON_SI | I2C_CON_STA | I2C_CON_I2EN);
}
正如您在标志上方看到的:SI、STA 也已设置。
那么是否应该为配置为
Slave 的I2C存在不同的
Init函数?
还有一个:函数
Chip_I2C_SetMasterEventHandler也需要在 I2C 从模式下使用吗?因为这个名字有点误导,除了以下内容之外我找不到任何好的解释:
/* Set the master event handler */
int Chip_I2C_SetMasterEventHandler(I2C_ID_T id, I2C_EVENTHANDLER_T event){
...
}
在它自己的定义中。
我假设“是”,因为这部分存在于提供的示例中......但我不明白它的作用。
你能帮我解决这个问题吗?