[X]关闭

xiicps_master.c函数问题(CH23 配置OV5640)

文档创建者:卢新硕
浏览次数:4687
最后更新:2019-09-28
问题1:
/*
         * Clear the interrupt status register before use it to monitor.(在使用中断状态寄存器之前先清除中断状态寄存器),中断状态在读取状态寄存器之后自动清零(类型为wtc),
         */
        IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET);
        XIicPs_WriteReg(BaseAddr, XIICPS_ISR_OFFSET, IntrStatusReg);
那么我得疑问是在读取状态寄存器之后,为什么还要将这个中断状态写入呢?如果读取出的这个中断状态含有效中断状态怎么办?这不是读取的时候白清除了吗?

问题2:
关于本函数中有一个填充fifo语句
/*
         * Transmit first FIFO full of data.将第一个充满数据的fifo传输
         */
        (void)TransmitFifoFill(InstancePtr);该函数的定义是在是不理解,主要是那一句
if (InstancePtr->SendByteCount > (s32)AvailBytes) {
                NumBytesToSend = (s32)AvailBytes;
        } else {
                NumBytesToSend = InstancePtr->SendByteCount;
        }
Avail是fifo中还可以存入的字节数吧?如果要发送的字节数大于剩余的有效空间字节数就将要发送的字节数设置为Avail,否则不变。
可是这个函数不是要将fifo填满吗?这个判断的依据是什么呢?

发表评论已发布 3

uisrc

发表于 2019-9-27 23:01:55 | 显示全部楼层

问题1、对于状态寄存器,写1清除,所以读出的状态,再写进去就可以清除相应的位了。再下次中断前,必须先清除之前的中断。
问题2、如果需要发送的数据量大于可以可以支持发送的数据量,就截取为可以发送的数据量。
越努力越幸运!加油!

卢新硕

发表于 2019-9-27 23:48:48 | 显示全部楼层

msxbo 发表于 2019-9-27 23:01
问题1、对于状态寄存器,写1清除,所以读出的状态,再写进去就可以清除相应的位了。再下次中断前,必须先清 ...

追问:老师您好,请问如果Avail表示的是可以发送的数据长度的话,其关系式为:
AvailBytes = (u8)XIICPS_FIFO_DEPTH -
                (u8)XIicPs_ReadReg(InstancePtr->Config.BaseAddress,
                                           XIICPS_TRANS_SIZE_OFFSET);


发送的数据长度在0-255,可是系统中定义的FIFO_DEPTH=16,如果size超过16的话,发送的数据长度不就是Avail的数值了,是一个负数。这种情况会出现吗?

uisrc

发表于 2019-9-28 09:48:29 | 显示全部楼层

不会,FIFO可以平滑速度,让发送速度更快,FIFO满了
越努力越幸运!加油!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则