打印
[其它产品/技术]

如果启用了I2C从站FIFO\"中的\"地址,为什么该行会将地址复制到FW缓冲区呢?

[复制链接]
364|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stormwind123|  楼主 | 2024-8-11 21:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我有一个基于"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);    }}

使用特权

评论回复
沙发
Betty1299| | 2024-8-23 12:08 | 只看该作者
在I2C通信协议中,从站(Slave)设备通常需要响应主站(Master)设备的请求。当主站设备发送一个地址帧到从站设备时,从站设备需要识别这个地址是否与自己的地址匹配。如果匹配,从站设备将准备响应主站设备的后续请求

使用特权

评论回复
板凳
B1lanche| | 2024-8-23 13:17 | 只看该作者
启用I2C从站FIFO中的地址,并将该地址复制到FW(Firmware)缓冲区,通常地址匹配方可,从站设备需要识别主站发送的地址是否与自己的地址匹配。将地址复制到FW缓冲区可以方便固件进行地址匹配检查

使用特权

评论回复
地板
Charlotte夏| | 2024-8-23 14:23 | 只看该作者
正常来说,一旦地址匹配成功,从站设备需要准备响应主站设备的读取或写入请求。将地址复制到FW缓冲区可以作为后续数据处理的起点

使用特权

评论回复
5
Alina艾| | 2024-8-23 15:28 | 只看该作者
当从站设备识别到地址匹配时,可能会触发一个中断。固件需要在中断服务程序中处理这个事件。将地址复制到FW缓冲区可以方便中断处理程序快速访问和处理地址信息

使用特权

评论回复
6
Estelle1999| | 2024-8-23 16:30 | 只看该作者
固件需要跟踪当前的通信状态,例如是否正在处理一个读取或写入请求。将地址复制到FW缓冲区可以帮助固件维护和更新通信状态

使用特权

评论回复
7
Carina卡| | 2024-8-23 18:14 | 只看该作者
如果地址匹配失败或通信过程中出现错误,固件需要能够回溯和诊断问题。将地址复制到FW缓冲区可以提供必要的调试信息

使用特权

评论回复
8
Betty996| | 2024-8-23 19:22 | 只看该作者
FIFO缓冲区可能用于存储多个数据帧,包括地址和数据。将地址复制到FW缓冲区可以帮助固件管理FIFO中的数据流,确保数据的正确顺序和处理

使用特权

评论回复
9
Carmen7| | 2024-8-24 08:31 | 只看该作者
地址不也是数据的一部分吗?

使用特权

评论回复
10
alxd| | 2024-8-24 10:00 | 只看该作者
总结来说,将I2C从站FIFO中的地址复制到FW缓冲区是为了方便固件进行地址匹配、数据处理准备、中断处理、状态跟踪、错误处理和调试,以及FIFO管理。这样可以提高通信的效率和可靠性,确保从站设备能够正确响应主站设备的请求

使用特权

评论回复
11
Emily999| | 2024-8-24 12:15 | 只看该作者
其实你可以通过程序,处理直接让地址去掉不就行了吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

371

主题

1669

帖子

1

粉丝