工具/软件:TI C/C++编译器
您好!
我使用 MSP430F5328 接口和使用 SPI 通信协议的 W25X10 winbound 串行闪存。 我使用的是 SMCLK 16MHz。
我已根据从器件和源代码配置 SPI、如下所示:
#define SPICLK 32.
uint8_t SourceAddr [16];
uint8_t DestAddr[16];
void main( void )
{
uint16_t IDcode = 0;
//将 P2.6设置为从器件复位
GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN6);
GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN6);
//P3.3、4选项选择
//FLASH_SPISIMO - P3.3
//FLASH_SPISOMI - P3.4
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P3、GPIO_PIN3 + GPIO_PIN4);
//P2.7 FLASH_SPICLK
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P2、GPIO_PIN7);
//初始化主设备
USCI_A_SPI_initMasterParam param ={0};
param.selectClockSource = USCI_A_SPI_CLOCKSOURCE_SMCLK;
param.clockSourceFrequency = UCS_getSMCLK();
param.desiredSpiClock = SPICLK;
param.msbFirst = USCI_A_SPI_MSB_FIRST;
param.clockPhase = USCI_A_SPI_PHASE_DATA_Changed_ONFIRST_captured_on_next;
param.clockPolarity = USCI_A_SPI_CLOCKPOLARITY_INACT_LOW;
返回值= USCI_A_SPI_initMaster (USCI_A0_BASE、¶m);
如果(STATUS_FAIL =返回值)
返回0;
//启用 SPI 模块
USCI_A_SPI_ENABLE (USCI_A0_BASE);
//现在初始化 SPI 信号、复位从器件
GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN6);
/*读取制造商 ID */
IDcode = SerialFlash_readid();
}
uint16_t SerialFlash_readid (void)
{
uint16_t IDcode;
// P2.6 --0,CS =0选择 SPI 闪存
GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN6);
//读取设备命令 0x90
SourceAddr[0]= 0x90;
//器件地址0x00的上部
SourceAddr[1]= 0x00;
//器件地址0x00的下半部分
SourceAddr[2]= 0x00;
SourceAddr[3]= 0x00;
//串行闪存发送数据
SerialFlash_SendData ((uint8_t *)&SourceAddr[0]、 4);
_DELAY_CYCLES (160000);
//串行闪存接收数据
SerialFlash_RcvData ((uint8_t *)&DestAddr[0],2);
// P2.6 - 1、CS = 1释放 SPI 闪存
GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN6);
//获取 IDcode
IDCODE =(DestAddr[0]<< 8)|(DestAddr[1]);
返回 IDCODE;
}
void SerialFlash_SendData (uint8_t *buf、uint32_t Length)
{
uint32_t i;
对于(i = 0;i <长度;i++)
{
// USCI_A0 TX 缓冲器就绪?
while (!(UCA0IFG&UCTXIFG));
UCA0TXBUF =*缓冲;
buf++;
}
}
void SerialFlash_RcvData (uint8_t *buf、uint32_t 长度)
{
uint32_t i;
对于(i = 0;i <长度;i++)
{
// USCI_A0 RX 缓冲器准备好了吗?
while (!(UCA0IFG&UCRXIFG));
* buf = USCI_A_SPI_receiveData (USCI_A0_BASE);
buf++;
}
}
我已经检查了示波器上的 MOSI 和时钟信号并变得非常完美。
但我无法在接收器缓冲器上正确读取制造商 ID。 大多数情况下、获取0xFF、0xFF、有时获取一些随机值。
能不能有人帮我解决这个问题。
谢谢、此致、
John