您好!
我编写了一个 SSI 的轮询版本、该版本使用以下函数在 MCU 和 Winbond 闪存之间传输字节。 一切都很好、我能够正常地与闪存交互。
uint8_t byte_transfer (uint8_t data){ SSIDataPut (SSI0_BASE、DATA); while (SSIBusy (SSI0_BASE)); uint32_t rx_buf; SSIDataGet (SSI0_BASE、&Rx_Buf); while (SSIBusy (SSI0_BASE)); 返回(uint8_t) rx_Buf; }
最近、我决定将 SSI 的轮询版本设为中断驱动版本、但我在这方面遇到了困难。 这是我目前所拥有的。
// SSI 初始化
void init_SPI (void){ SysCtlPeripheralEnable (SYSCTL_Periph_SSI0); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); GPIOPinConfigure (GPIO_PA2_SSI0CLK); GPIOPinConfigure (GPIO_PA4_SSI0RX); GPIOPinConfigure (GPIO_PA5_SSI0TX); GPIOPinTypeSSI (GPIO_Porta_base、 GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_2); SSIConfigSetExpClk (SSI0_BASE、 SysCtlClockGet ()、 SSI_FRF_MOTO_MODE_0、 SSI_MODE_MASTER、 1000000、 8); GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_3); GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3、GPIO_PIN_3); SSIEnable (SSI0_BASE); //从 SSI 端口读取任何残留数据。 while (SSIDataGetNonBlocking (SSI0_BASE、&g_Rx_Buf)); SSIIntDisable (SSI0_BASE、SSI_TXFF | SSI_RXFF | SSI_RXTO | SSI_RXOR); SSIIntClear (SSI0_BASE、SSI_TXFF | SSI_RXFF | SSI_RXTO | SSI_RXOR); //启用 SSI 中断。 IntEnable (INT_SSI0); //启用处理器中断。 IntMasterEnable(); }
//全局变量
uint32_t g_rx_buf = 0;//全局 Rx 缓冲 器 uint32_t g_tx_buf = 0;//全局 TX 缓冲 器易失性 uint32_t g_wait_for_int = 0;//标志等待中断发生
// SSI 数据字节传输
uint8_t byte_transfer (uint8_t data){ G_WAIT_for_int = 1; G_TX_Buf =(uint32_t)数据; //启用发送和接收中断。 这将启动实际操作 //传输。 SSIIntEnable (SSI0_BASE、SSI_TXFF | SSI_RXFF | SSI_RXTO); while (g_wait_for_int);//等待 ISR 触发 // IntTrigger (INT_SSI0); 返回(uint8_t) g_rx_buf; }
// SSI ISR
void SSI0IntHandler (void){ uint32_t status = SSIIntStatus (SSI0_BASE、TRUE); G_WAIT_for_int = 0; SSIIntClear (SSI0_BASE、SSI_TXFF | SSI_RXFF | SSI_RXTO); SSIDataPutNonBlocking (SSI0_BASE、g_TX_Buf); SSIDataGetNonBlocking (SSI0_BASE、&g_Rx_Buf); SSIIntDisable (SSI0_BASE、SSI_TXFF | SSI_RXFF | SSI_RXTO); }
//使用传输函数读取闪存 ID
void read_id (void){
uint8_t man_id、dev_id;
UARTprintf ("正在获取闪存信息...\n");
CHIP_SELECT (~GPIO_PIN_3);///芯片选择低电平
byte_transfer (wb_read_ID);
Byte_transfer (0x00);
Byte_transfer (0x00);
Byte_transfer (0x00);
man_id = byte_transfer (0x00);
DEV_id = BYTE_TRANSFRATE (0x00);
CHIP_SELECT (GPIO_PIN_3);///芯片选择高电平
UARTprintf ("制造 ID:\%2x\n"、man_id);
UARTprintf ("设备 ID:\%2x\n"、DEV_id);
}
因此、我使用了调试器并在 ISR 处设置了一个断点、我一直执行到程序结束、我获得0xFF 表示制造 ID (错误值、应为0x17)、 0xEF 表示器件 ID (正确)。
如果我只是运行程序而不设置任何断点、我将为两个 ID 获得0xFF。
我有点卡、希望有人能提供一些指导。 提前感谢!
此致、
Jacky