您好!
我已经编写了一个工作中断驱动的 SSI、用于与 Winbond 闪存通信。 下面是伪代码:
====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//在主设备和从设备之间传输数据字节
SSI_TRANSSFUSion{
- 将 SS 拉至低电平
- SSIIntEnable (SSI0_BASE、SSI_TXFF | SSI_RXFF | SSI_RXTO);
- 中断应在此处开始发生...
- while 循环、等待 SS 线路为高电平(一旦 ISR 中的数据事务完成、将被拉高)
}
// SSI 的中断处理程序
SSI ISR{
检查并保存中断状态、然后将其清除
IF (STATUS &(SSI_RXFF | SSI_RXTO)){
while (1){
继续读取 RX FIFO
如果 RX FIFO 为空、则中断循环
如果接收完所需的数据(RX 字节计数达到0)、禁用 SSI_RXFF
}
if (已发送和接收所有必需的数据字节){
将 SS 上拉
}
}
if (status & SSI_TXFF){
for loop (最多可填充8次 TX FIFO){
如果传输完所需的数据(TX 字节计数达到0)、则禁用 SSI_TXFF
如果 TX FIFO 已满、则中断循环
}
}
}
============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
我将使用一个示例来说明我的问题、比如我何时要读取的器件 ID 和制造商 ID
Winbond 闪存。 闪存需要主器件发送 WW_READ_ID、后跟3个0x00字节、然后闪存将发送
输出设备 ID +制造商 ID。
下面是一个用于说明传输的图:
XX =无关
//传输4个数据字节,需要两个字节的设备 id +制造商 id
TX RX
WB_READ_ID XX
0x00 二十
0x00 XX
0x00 XX
//主设备需要驱动时钟以允许将 man_id 和 dev_id 移出
0x00 man_id
0x00 DEV_id
为了读取器件 ID +制造商 ID、我的代码将/应该:
- 标志 SSI_TXFF、因为 TX FIFO 最初为空
- 进入 ISR (第一次)
- 加载6个数据字节
- Wb_read_ID
- 0x00
- 0x00
- 0x00
- 0x00
- 0x00
- TX 计数达到0意味着不再有数据要发送
- 禁用 TX 中断
- 离开 ISR
- 将 SSI_RXFF 标记为从器件已接收到这6个字节并将6个字节发送回主器件
- 进入 ISR (第二次)
- 读取 RX FIFO、6个字节
- 二十
- 二十
- 二十
- 二十
- man_id
- DEV_id
- RX 计数达到0意味着不再接收数据
- 禁用 RX 中断
- 将 SS 上拉
- 离开 ISR
中断等待 SSI_TRANSSOP 输出高电平的 while 环路
程序结束。
大家可以看到、根据我的代码的逻辑、在本例中、我应该只进入 ISR 两次。 时间
我对我的代码进行分步调试(在 ISR 中插入断点)、我能够看到程序恰好进入两次。 但是、
当我执行完整运行时、我会得到3个 ISR 条目、这是怪异的(我插入了一个计数器来保持 ISR 条目计数、我也是如此
尝试切换 GPIO 以使用逻辑分析仪监控 ISR 的进入/退出)。
我对代码或 cortex M4的中断机制有什么不正确的理解吗...等等?
此致、提前感谢您!
Jacky