⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fm25l256b_fram.c

📁 FM25L256B是采用先进的铁电技术制造的256Kb非易失性存储器。铁电随机存储器(FRAM)具有非易失性
💻 C
字号:
//******************************************************************************
//  MSP430F2013 FRAM Demo - Software SPI control FRAM
//
//  Description: 
//  ACLK = n/a, MCLK = SMCLK = default DCO
//
//               MSP430F2013
//            -----------------
//        /|\|              XIN|-
//         | |                 |
//         --|RST          XOUT|-
//           |                 |
//           |             P1.0|-->/CS
//           |             P1.1|-->SO
//           |             P1.2|-->/WP
//           |             P1.3|-->SI
//           |             P1.4|-->SCK
//           |             P1.5|-->HOLD
//     
//
//  Tom Chen
//  Value Provider International Corp.
//  2008/07/02
//  Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.40A
//******************************************************************************

#include  <msp430x20x3.h>

#define CS    0x01
#define SO    0x02
#define WP    0x04
#define SI    0x08
#define SCK   0x10
#define HOLD  0x20

unsigned char Data ;
unsigned char Data1[10]={0xaa,0x55,0xaa,0x55,0x01,0x02,0x04,0x08,0x77,0xFF} ;
unsigned char Data2[10] ;


void FRAM_SPI_txByte(unsigned char data)
{
  unsigned char bits, temp;
  
  P1OUT &= ~CS;                             // Set CS low (CS = 0)
  temp = data;
  bits = 0x08;                              // Load SPI bit counter
  
  while (bits != 0x00)                      // Loop until all bits are shifted
  {
    if ((temp & 0x80))                        // Test data bit
      P1OUT |= SI;                          // data Hi (SI = 1)
    else
      P1OUT &= ~SI;                         // data low (SI = 0)
    
    P1OUT |= SCK;                          // Set SCK Hi (SCK = 1)
    temp = (temp << 1);                     // Shift bits 1 place to the left
    _NOP();                                 // Quick delay
    P1OUT &= ~SCK;                           // Set SCK low (SCK = 0)
    bits = (bits - 1);                      // Loop until 8 bits are sent
  }


}


            
unsigned char FRAM_SPI__rxByte(void)  // Read 8 bits of SPI data
{
   unsigned char bits, temp = 0;            // SPI bit counter

   P1OUT &= ~CS;                             // Set CS low (CS = 0)
   bits = 0x08;                             // Load SPI bit counter
   while (bits > 0)                         // Loop until all bits are read
   {
      P1OUT |= SCK;                        // Set SCK Hi
      temp = (temp << 1);                   // Shift bits 1 place to the left
      if (P1IN & SO)                       // Check digital input
        temp = (temp + 1);                  // If input is 'H' store a '1'
      P1OUT &= ~SCK;                         // Set SCK Lo
      bits = (bits - 1);                    // Decrement SPI bit counter
   }

   return (temp);                           // Return 8-bit data byte
}   

void FRAM_SPI_writeBlock(unsigned int Address,
                           unsigned int numBytes, void* TxData)
{        
   unsigned char *temp;
   
   temp = (unsigned char *)TxData;          // Initialize array pointer   
   FRAM_SPI_txByte(0x06);                   //send Op-Code Commands:WREN (Set Write Enable Latch) 0000 0110b
   P1OUT |= CS;  
   FRAM_SPI_txByte(0x02);                   //send Op-Code Commands:WRITE (Write Memory Data) 0000 0010b
   FRAM_SPI_txByte(Address >>0x8);          // MSB [ADDR]
   FRAM_SPI_txByte(Address );               // LSB [ADDR]                 
   for (unsigned int i = 0; i < numBytes; i++) {
     FRAM_SPI_txByte(*(temp));              // Send data and ack
     temp++;                                // Increment pointer to next element
   }
   P1OUT |= CS;                               // Send Stop condition
}


void FRAM_SPI_readBlock(unsigned int Address,
                          unsigned int numBytes, void* RxData)
{
  unsigned char* temp;
  
  temp = (unsigned char *)RxData;           // Initialize array pointer
  FRAM_SPI_txByte(0x03);                    //send Op-Code Commands:READ Read Memory Data 0000 0011b
  FRAM_SPI_txByte(Address >>0x8);           // MSB [ADDR]
  FRAM_SPI_txByte(Address );                 // LSB [ADDR]   
  for (unsigned int i = 0; i < numBytes; i++) {
    
    *(temp) = FRAM_SPI__rxByte();             // Read 8 bits of data and send ack
    temp++;                                 // Increment pointer to next element
  }
  P1OUT |= CS;                                             // Send Stop condition
}

void main(void)
{
  
  
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  P1DIR |= (CS+SI+WP+SCK+HOLD);             // Set pins DIR. HI 
  P1DIR &= ~SO;                             // Set pins DIR. Lo
  
  P1OUT |= (CS+SCK+HOLD);
  P1OUT &= ~(SCK+WP);
  

  while(1)
  {
 FRAM_SPI_writeBlock(0x0610,10,Data1);
  _NOP();
  
  for(int i=0 ; i<4 ; i++)
    Data2[i]=0;
  
  FRAM_SPI_readBlock(0x0610,10,Data2);
  }

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -