我正在为处理器编写 SD 卡 SPI 驱动程序。我知道 SPI 驱动程序很好,因为我也将它用于 LCD,并且直到现在,一直在愉快地向卡发送命令。我在处理一项特定交易时遇到了麻烦,这与我所看到的任何其他交易都没有什么不同。
在 SPI 总线上写出数据后,我等待中断回调说接收和发送完成。有两个回调,它们将 a 中的以下布尔标志设置struct
为 true:
m_transaction_status.sdts_rx_complete
m_transaction_status.sdts_tx_complete
在正常的程序流程中,我等待这些标志设置后再继续:
while ((m_transaction_status.sdts_rx_complete == false) //
|| (m_transaction_status.sdts_tx_complete == false))
{
// Check whether we've had an error.
if (m_transaction_status.sdts_error == true)
{
LOG_ERROR(SD::MODULE,
"transfer_data: Transaction error.");
transfer_status = false;
break;
}
}
对于问题事务,我在回调中设置了一个断点,可以看到两个标志都已设置,但是当我返回正常流程时,变量突然不可用,并且似乎false
因为我永远卡在循环中。此循环用于所有其他事务,没有问题。
我有什么理由可以调查为什么这些变量被设置但随后(显然)被清除或解除分配或其他不愉快的事情?
编辑:
中断确实是微型中断(准确地说是瑞萨电子 RL78)。
结构声明是:
/**
* The state of an SD SPI transaction.
*/
struct SDTransactionStatus
{
/** Transaction error flag. */
bool sdts_error;
/** Transmission completion flag. */
bool sdts_tx_complete;
/** Reception completion flag. */
bool sdts_rx_complete;
};
被struct
实现为我SD
班级的私人成员。标志是通过回调中的简单设置器函数设置的。