Quantcast
Channel: MSP 低功耗微控制器论坛 - 最近的话题
Viewing all articles
Browse latest Browse all 3634

msp430F5438 spi与铁电存储器FM25H20

$
0
0

F5438的spi与FM25H20通信,现在读取FM25H20的状态寄存器返回的也是0xff,给FM25H20的任一地址写数据,然后再读该地址的数据,返回的也是0xFF,不论什么操作,FM25返回的都是0xff。不知道出了什么问题。。。

#include "msp430x54x.h" #include <stdlib.h> #include <stdio.h> #include <string.h>

#define WREN_CMD 0x06    //允许写操作 

#define WRDI_CMD 0x04    //禁止写

 #define RDSR_CMD 0x05    //读状态寄存器

 #define WRSR_CMD 0x01    //写状态寄存器

#define READ_CMD 0x03    //读存储器数据

#define WRITE_CMD 0x02   //写存储器数据

#define SLEEP_CMD 0xB9  //进入睡眠模式

#define DUMY_CMD  0      //产生读时序

 

unsigned char FmTxData=0x55;

unsigned char FmRxData;

unsigned char temp;

 unsigned char temp1;

unsigned char rxdata;

void  WrMemData(long int addr, unsigned char c);

unsigned char RdMemData(long int addr);

 unsigned char RdMemStatReg();

 

 

void Init_SPI1(void)

{      P3SEL |=0x80;                       //P3.7功能选择为SPI1,--SIMO    

P3SEL &=0xBF;                       //p3.6端口模式    

P5SEL |=0x30;                       //P5.4/5功能选择为SPI1,---SOMI,CLK        

P3DIR  |= 0x40;                    //P3.6输出,控制FM片选信号    

P4DIR  |= 0x03;               //p4.0/1输出,控制wp和hold        

P3DIR |=0x80;   // SIMO output    

P5DIR &=0xEF;    // SOMI input    

P5DIR |=0x20;     //CLK output                

P3OUT  |= 0x40;     //CS is high    

P4OUT  |= 0x03;     // wp and hold are high                

UCB1CTL1 |= UCSWRST;             // 复位SPI1状态机        

UCB1CTL0 |= UCMST+UCSYNC+UCCKPL+UCMSB ; // 3-pin, 8位, SPI master, Clock polarity high, MSB    

UCB1CTL1 |= UCSSEL_2  ;                        // 选择SCK参考源为SMCLK    

UCB1BR0   = 0x02  ;                            // SCK = SMCLK/2    

UCB1BR1   = 0 ;   

 //UCA0MCTL = 0;        

UCB1CTL1 &=~UCSWRST ;               // SPI1状态机使能

}

 

unsigned char TransceiveSPI1 (unsigned char txdata)   {       while (!(UCB1IFG & UCTXIFG));             // wait until last SPI-Transmission is finished       UCB1TXBUF = txdata;                         // send 8 clocks "txdata" and SPI-clocks       while (!(UCB1IFG & UCRXIFG));           // wait until one byte is received       rxdata = UCB1RXBUF;         return rxdata;   }

 

/*char RxTxSPI1(unsigned char c)   //发送接收程序 { //////   while (!(UCB1IFG&UCTXIFG));           // USCI_B1 TX buffer ready? //   SPI1Rxflg=0;    UCB1TXBUF=c;    while(!SPI1Rxflg);    SPI1Rxflg=0;    return UCB1RXBUF; }    TxSPI1(char c)   //发送程序 {    UCB1TXBUF=c; } char RxSPI1()    //接收程序 {     char temp;     temp= UCB1RXBUF;     return temp; }  */

void MemEnable()       //发送器件写操作命令 {   P3OUT &=~BIT6;   TransceiveSPI1(WREN_CMD);   P3OUT |=BIT6; }

void MemDisable()      //发送器件写器件禁止 {   P3OUT &=~BIT6;   TransceiveSPI1(WRDI_CMD);  // if(TxFlg==1)   P3OUT |=BIT6;

}

void WrMemStatReg(unsigned char c)//写状态寄存器 {   MemEnable();   P3OUT &=~BIT6;  // TxFlg=0;   TransceiveSPI1(WRSR_CMD);

  TransceiveSPI1(c);    P3OUT |=BIT6; }

unsigned char RdMemStatReg()//读寄存器 { //  unsigned char temp;   P3OUT &=~BIT6;   TransceiveSPI1(RDSR_CMD);   temp1=TransceiveSPI1(DUMY_CMD); //  =RxSPI1();   P3OUT |=BIT6;   return temp1; }

void  WrMemData(long int  addr, unsigned char c)//写一个字节数据到指定地址 {   P3OUT &=~BIT6;   TransceiveSPI1(WREN_CMD);

   // MemEnable();  // P3OUT &=0xBF;  // TxFlg=0;

  TransceiveSPI1(WRITE_CMD);   TransceiveSPI1((addr&0xff0000)>>16);   TransceiveSPI1((addr&0x00ff00)>>8);   TransceiveSPI1(addr&0x0000ff);     TransceiveSPI1(c);   P3OUT |=BIT6; }

unsigned char RdMemData(long int addr)//从指定地址读一个字节 { //  unsigned char temp;   P3OUT &=~BIT6;   TransceiveSPI1(READ_CMD);   TransceiveSPI1((addr&0xff0000)>>16);   TransceiveSPI1((addr&0x00ff00)>>8);   TransceiveSPI1(addr&0x0000ff);   temp=TransceiveSPI1(DUMY_CMD);    // TxSPI1(DUMY_CMD); //  temp=RxSPI1();

  P3OUT |=BIT6;   return temp; }


Viewing all articles
Browse latest Browse all 3634

Trending Articles