📄 fm25l256b_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 + -