工具/软件:TI-RTOS
我在为MSP430编写SPI代码以与闪存芯片通信时遇到问题。
我尝试编写轮询例程和中断ISR,结果是相同的。 无论我尝试什么,UCB1RXBUF始终为零。
以下是我的init例程:
void hal SPI初始化(void)
{
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//下面是所有相关的IO引脚:
// FLASH_SS 3.6 UCB1STE/CS# (低有效)
// FLASH_MOSI 3.7 UCB1SIMO/SI
// 闪烁_错误 5.4 UCB1SOMI/SO
// FLASH_SCLK 5.5 UCB1CLK/SCK
P3DIR || FLASH_SS; // WFP 3.6 FLASH_SS是一个输出引脚
P3OUT |= FLASH_SS; //活动低电平,(禁用)
//设置MOSI (WFP 3.7),Miso (WFP 5.4),SCLK (WFP 5.5)的特殊模式
GPIO_setAsPeripheralModuleFunctionOutputPin (GPIO端口P3,FLASH_MOSI);
GPIO_setAsPeripheralModuleFunctionInputPin (GPIO端口P5,FLASH_miso);
GPIO_setAsPeripheralModuleFunctionOutputPin (GPIO端口P5,FLASH_SCLK);
//在主模式下初始化SPI
USI_B_SPI_initMasterParam参数={0};
param.selectClockSource = USI_B_SPI_CLOCKSOURCE_SMCLK;
Param.clockSourceFrequency = UCS_getSMCLK();
param.desiredSpiClock = 100万;
Param.msbFirst = USI_B_SPI_MSB_FIRST;
Param.clockPhase = USI_B_SPI_PHASE DATA_Captured_ONFIRST_changed_on_next;
Param.clockPolarity = USI_B_SPI_CLOCKPOLARITY_INACILY_LOW; //或USI_B_SPI_CLOCKPOLARITY_INACILY_HIGH;
布尔RC = USI_B_SPI_initMaster(USCI_B1_base,¶m);
断言(rc == status_success);
//启用SPI模块
USI_B_SPI_ENABLE (USI_B1_BASE);
//禁用中断
USI_B_SPI_clearInterrupt (USI_B1_BASE,
USI_B_SPI_receive中断|USI_B_SPI_Transmit_interrupt);
USI_B_SPI_DisableInterrupt (USI_B1_BASE,
USI_B_SPI_Receive_interrup|USI_B_SPI_Transmit_interrupt);
}
接下来是SPI_TRANSFER例程:
void hal_spi_transfer(.
uINT8_t *txbuf,uint8_t *rxbuf,size_t txlen,uint8_t flags)
{
IF (标志和SPI_CS_ENABLE)
flash_ss_active();
//启动第一个字节传输
对于(; txlen;--txrxlen){
UINT8_t Tbyte = txbuf ? *txbuf++:0;
// USCI_B_SPI_TRICATEData(USCI_B1_BASE,Tbyte);
UCB1TXBUF = Tbyte;
UCB1IFG &=~UCRXIFG; // Clear RXIFG as Transmit (将RXIFG清除为传输)始终设置RX标记
//等待直到接收到RX字节
同时(!(UCB1IFG和UCRXIFG))
;
UINT8_t rbyte = UCB1RXBUF; // USI_B_SPI_receiveData(USCI_B1_base);
IF (rambuf !=空)
*rxbuf++= rbyte;
}
IF (标志和SPI_CS_DISABLE)
flash_ss_inactive();
}
调用此例程时,仅读取零。
在逻辑分析器上,我可以看到数据在SPI总线上是正确的。 在以下示例中,我们发送flash_readid命令(hex 9F),然后读取芯片配置信息的0x56字节:
HAL_SPI_SEND_BYTE (FLASH_READID,SPI_CS_ENABLE);
HAL_SPI_TRANSFER (NULL,FLASH_CFI,FLASH_CFI,SPI_CS_DISABLE的大小);
在逻辑分析器上,我们可以看到所有SPI数据:
我们可以在蓝线(探测器6)上看到闪存芯片收到了命令并正在返回CFI数据。 我可以放大并检查数据,它是绝对正确的。
我还在CPU引脚(引脚51)上放置了示波器探头,结果相同。 电压水平看起来正常 (3V左右)。
但是,'flash_CFI[]'阵列始终为零。
是否可能是我的硬件损坏,SPI接收器不工作?
-Allan Schwartz


