完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我有一个基于"I2C_Slave_Using_Callbacks" 的 PSoC4 MAX 器件的 I2C 从设备项目。 它已启用"Accept Slave Address In RX FIFO" 。 但是,我的设备被主站发送的从站地址淹没了。 下面粗体字一行是将地址复制到我的 FW 缓冲区。 我本以为地址会在此之前被删除,但事实似乎并非如此。 我还有什么不明白的地方?
static void SlaveHandleDataReceive(CySCB_Type *base, cy_stc_scb_i2c_context_t *context){ /* Check whether there is space to put data */ if (context->slaveRxBufferSize > 0UL) { if (context->useRxFifo) { uint32_t level; /* Get the number of bytes to read from RX FIFO */ uint32_t numToCopy = Cy_SCB_GetRxFifoLevel(base) + 1UL; /* Get data from RX FIFO */ numToCopy = Cy_SCB_ReadArray(base, context->slaveRxBuffer, numToCopy); context->slaveRxBufferIdx += numToCopy; context->slaveRxBufferSize -= numToCopy; context->slaveRxBuffer = context->slaveRxBuffer[numToCopy]; /* Prepare to read a next chunk of data */ if (context->slaveRxBufferSize > CY_SCB_I2C_FIFO_SIZE) { level = context->slaveRxBufferSize - CY_SCB_I2C_FIFO_SIZE; level = ((level > CY_SCB_I2C_FIFO_SIZE) ? (CY_SCB_I2C_FIFO_SIZE / 2UL) : level) - 1UL; } else { SCB_I2C_CTRL(base) |= SCB_I2C_CTRL_S_NOT_READY_DATA_NACK_Msk; level = (context->slaveRxBufferSize == 0UL) ? (0UL) : (context->slaveRxBufferSize - 1UL); Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); } /* Set the RX level to trigger an interrupt */ Cy_SCB_SetRxFifoLevel(base, level); } else { /* Continue the transfer: send an ACK */ SCB_I2C_S_CMD(base) |= SCB_I2C_S_CMD_S_ACK_Msk; /* Put data into the RX buffer */ context->slaveRxBuffer[context->slaveRxBufferIdx] = (uint8_t) Cy_SCB_ReadRxFifo(base); ++context->slaveRxBufferIdx; --context->slaveRxBufferSize; } } else { /* Finish a transfer: send a NACK and discard the received byte */ SCB_I2C_S_CMD(base) |= SCB_I2C_S_CMD_S_NACK_Msk; Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); }} |
|
相关推荐
1个回答
|
|
0) {
/* Copy the address to the FW buffer */ context->slaveRxBuffer[context->slaveRxBufferIndex] = context->rxFifo[0]; /* Increment the buffer index */ context->slaveRxBufferIndex++; /* Decrement the remaining size */ context->slaveRxBufferSize--; /* Clear the first entry in the RX FIFO */ Cy_SCB_I2C_ClearRxInterrupt(base, 1); /* Call the user-defined callback function */ if (context->slaveRxBufferIndex == 1) { context->callback(CY_SCB_I2C_SLAVE_WRITE_EVENT, NULL); } } } 从您的代码中,我可以看到您正在实现一个I2C从站,使用回调函数处理数据接收。您提到已经启用了"Accept Slave Address In RX FIFO"选项,但是您的设备仍然被主站发送的从站地址淹没。 问题可能出在以下几行代码: ``` /* Copy the address to the FW buffer */ context->slaveRxBuffer[context->slaveRxBufferIndex] = context->rxFifo[0]; ``` 这里,您将从RX FIFO中的第一个字节(即从站地址)复制到FW缓冲区。然而,您希望在处理完地址后将其从FIFO中删除。这就是为什么您在下一行代码中调用了`Cy_SCB_I2C_ClearRxInterrupt(base, 1);`,以清除RX FIFO中的第一个条目。 但是,这里可能存在一个问题:在调用回调函数之前,您可能需要先处理FIFO中的数据。在您的代码中,回调函数在`context->slaveRxBufferIndex == 1`时被调用,这意味着当FW缓冲区中只有一个字节时,回调函数就会被调用。然而,这个字节可能是从站地址,而不是实际的数据。 为了解决这个问题,您可以尝试以下步骤: 1. 在复制地址到FW缓冲区之前,检查RX FIFO中的下一个字节是否是有效的数据。如果是,您可以跳过地址处理。 2. 如果RX FIFO中的下一个字节是有效的数据,您可以将地址从FIFO中删除,然后继续处理数据。 3. 如果RX FIFO中的下一个字节不是有效的数据,您可以将地址复制到FW缓冲区,并在回调函数中处理它。 这样,您可以确保从站地址不会被淹没,并且您的设备可以正确地处理接收到的数据。 |
|
|
|
只有小组成员才能发言,加入小组>>
TLE9879_BLDC电机启动需要用手拨一下才能转动,怎么解决?
2977 浏览 2 评论
3994 浏览 9 评论
请问TLE5012B_E1000 启动后为什么位置不能正确获取
3470 浏览 9 评论
1128 浏览 8 评论
3407 浏览 7 评论
284浏览 2评论
137浏览 2评论
248浏览 2评论
TLE9879_BLDC电机启动需要用手拨一下才能转动,怎么解决?
2977浏览 2评论
如果是打开已有的dave工程,怎么查看这个工程选择的mcu型号?
283浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-1 13:39 , Processed in 0.677626 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191