NXP MCU 技术william hill官网
直播中

安立路

8年用户 829经验值
私信 关注
[问答]

如何实现中断模式使LPC1125在I2C上作为从属设备工作?

大家好,
我已经检查过这个问题,但没有找到任何帖子。
我试图使用中断模式使 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);
}
我的事件函数定义为:

static 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){
...
}
在它自己的定义中。
我假设“是”,因为这部分存在于提供的示例中......但我不明白它的作用。
你能帮我解决这个问题吗?

更多回帖

发帖
×
20
完善资料,
赚取积分