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; }