This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F5328接口,具有使用SPI的W25X10缠绕串行闪存

Guru**** 2027820 points
Other Parts Discussed in Thread: MSP430F5328
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/565299/msp430f5328-interface-with-w25x10-winbound-serial-flash-using-spi

部件号:MSP430F5328

工具/软件: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;

       //设置为从属设备重置的WFP 2.6
       GPIO_setAsOutputPin (GPIO端口P2,GPIO_PIN6);
       GPIO _setOutputHighOnPin( GPIO端口P2,GPIO _PIN6 );              
       
       //WFP,3.3 4选项选择
       //FLASH_SPISIMO - WFP 3.3
       //FLASH_SPISOMI - WFP 3.4
       GPIO_setAsPeripheralModuleFunctionInputPin (GPIO端口P3,GPIO端口PIN3 + GPIO PIN4);
       //WFP 2.7 FLASH_SPICLK
       GPIO _setAsPeripheralModuleFunctionInputPin (GPIO_PORT_P2, GPIO_PIN7);
   
       //初始化主中继器
       USI_A_SPI_initMasterParam参数={0};
       param.selectClockSource = USI_A_SPI_CLOCKSOURCE_SMCLK;
       Param.clockSourceFrequency = UCS_getSMCLK();
       param.desiredSpiClock = SPICLK;
       Param.msbFirst = USI_A_SPI_MSB_FIRST;
       Param.clockPhase = USI_A_SPI_PHASE DATA_Changed_ONFIRST_Captured_on_next;
       Param.clockPolarity = USI_A_SPI_CLOCKPOLARITY_INACILY_LOW;
       返回值= USI_A_SPI_initMaster(USCI_A0_base,&param);                

       如果(status_fail == returnValue)
               返回0;
       
       //启用SPI模块
       USI_A_SPI_ENABLE (USI_A0_BASE);
       
       //现在已初始化SPI信号,重置从属设备
       GPIO_setOutputLowOnPin (GPIO端口P2,GPIO _PIN6);   

       /*正在读取制造商ID */

IDcode =SerialFlash_readid();

}

UINT16_t SerialFlash_readid (void)

   uINT16_t ID代码;


    // WFP 2.6 --0,CS =0选择SPI闪存
   GPIO _setOutputLowOnPin (GPIO端口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周期(16万);
   //串行闪存接收数据
   SerialFlash_RcvData((uint8_t *)&DestAddr[0],2);


   // WFP 2.6 --1, CS =1释放SPI闪存
   GPIO _setOutputHighOnPin (GPIO端口P2,GPIO _PIN6);


   //获取ID代码
   IDcode =(DestAddr[0]<<8)|(DestAddr[1]);


   返回ID代码;       
}

void SerialFlash_SendData( uint8_t *buf,UINT32_t长度)

 uINT32_t i;      
 用于( I =0;I <长度;I++)
 {    
     // USI_A0 TX缓冲器就绪?
     同时(!(UCA0IFG&UCTXIFG));     
     UCA0TXBUF =* buf;
     buf++;     
 }  
}

void SerialFlash_RcvData( uint8_t *buf,UINT32_t长度)

   uINT32_t i;   
   用于( I =0;I <长度;I++)
   {          
       // USI_A0 RX缓冲器准备就绪?
       同时(!(UCA0IFG&UCRXIFG));
       *buf = USI_A_SPI_receiveData(USCI_A0_base);
       buf++;
   }
}

我已经检查了示波器上的MOSI和时钟信号,并取得了完美的结果。

但我无法在接收器缓冲区上正确读取制造商ID。 大多数情况下会获得0xFF,0xFF或有时会获得一些随机值。


请大家帮我解决这个问题。


谢谢,此致,

John

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不知怎么的,此帖子在编译器论坛中出现了2次。  我们的编译器专家无法回答这个问题。  我将 另一条线程移至 MSP设备论坛。  请在此处关注。  

    谢谢,此致,

    -George