完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好,
我已经检查过这个问题,但没有找到任何帖子。 我试图使用中断模式使 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){ ... } 在它自己的定义中。 我假设“是”,因为这部分存在于提供的示例中......但我不明白它的作用。 你能帮我解决这个问题吗? |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
1912个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
36369 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
4405 浏览 0 评论
6063 浏览 1 评论
6772 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
4221 浏览 0 评论
625浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
621浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
616浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
698浏览 2评论
802浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-29 18:39 , Processed in 1.327705 second(s), Total 75, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号