#include<msp430x16x.h>
//#include"MMC.h"
const unsigned char command[5]={0x9F,0x82,0x85,0x03,0x81};
struct dataflash{
unsigned char command;
unsigned int pageaddr:13;
unsigned int bufaddr:11;
unsigned char dontcare;
unsigned char *bufferptr;
unsigned char finish;
unsigned int count;
unsigned int noofbytes;
unsigned char timeval;
};
typedef struct dataflash DATAFLASH;
void delay(int x)
{
while(x)
{
x--;
}
}
void Init()
{
/*Clock initialization to 4.601MHZ MCLK, 2.294MHZ SMCLK*/
DCOCTL=0XE0; //MAX
BCSCTL1=0X87;//MAX RESISTOR SELECT
BCSCTL2=2; //DCOCLK
P3SEL|=0XFF; //selecting spi pins
P3DIR|=0X01; //setting direction for cs pin
/*SPI initialization*/
U1CTL=0X17; //enabling spi, 8-bit and master mode
U1TCTL=0XA3; // setting clk phase polarity and selecting smclk
U1BR1=0; //setting baudrate for spi must be gt 2
U1BR0=2;
U1MCTL=0; //must be 0
ME2=0X10; //enabling spi
U1CTL=0X16;
P1SEL|=0x11; //smclock
P1DIR|=0x11;
/*Timer initialization*/
TACCTL0=0X0080; //TOGGLE
TACCR0=0x0; //COUNT
TACTL=0X02D0; //SMCLK ,CONT MODES
}
void uart_write(unsigned char *str)
{
unsigned int i=0;
while(str[i])
{
if(TXEPT==1)
U0TXBUF=str[i]; i++;
delay(100);
}
}
unsigned char uart_read()
{
unsigned char dat;
while(!(IFG1 & URXIFG0)); //waiting for receive flag to set
dat = U0RXBUF;
IFG1 &=~1;
return dat;
delay(10);
}
void spi_write(unsigned char transmit)
{
U1TXBUF=transmit; //load data to transmit
while(UTCTL1!=0XA3); //waiting for transmit flag to set
UTCTL1=0XA2;
}
unsigned char spi_read(unsigned char tmp)
{
U1TXBUF=tmp; //load data to transmit
while(UTCTL1!=0XA3); //waiting for transmit flag to set
UTCTL1=0XA2; //clearing flag
//while(!(URXIFG1)); //waiting for receive flag to set
return U1RXBUF;
}
void AT45DCB008D(DATAFLASH *flashptr)
{
unsigned long int address;
P5OUT&=0xFE;
spi_write(flashptr->command); //sending opcode to flash cardz
if(flashptr->command==command[0])
{
for(;flashptr->count<flashptr->noofbytes;\
flashptr->count++)
{
*(flashptr->bufferptr+flashptr->count)=spi_read('a'); //reading manufacture ID
}
flashptr->timeval=0; //setting time delay
}
else
{
address=flashptr->pageaddr;
address<<=11;
address|=flashptr->bufaddr;//<<11|flashptr->bufaddr;
spi_write((unsigned char)address/0x10000); //loading 3 bytes of address
spi_write((unsigned char)address/0x100);
spi_write((unsigned char)address&0xFF);
if(flashptr->command==command[1]||flashptr->command==command[2])
{
for(;flashptr->count<flashptr->noofbytes;\
flashptr->count++)
{
spi_write(*(flashptr->bufferptr+flashptr->count)); //writing data to the flash
}
flashptr->timeval=17; //setting time delay
}
if(flashptr->command==command[3])
{
for(;flashptr->count<flashptr->noofbytes;\
flashptr->count++)
{
*(flashptr->bufferptr+flashptr->count)=spi_read('a'); //reading data from flash
}
*(flashptr->bufferptr+flashptr->count)=0;
flashptr->timeval=0; //setting time delay
}
if(flashptr->command==command[4])
{
flashptr->timeval=15; //setting time delay
}
}
P5OUT|=1;
flashptr=0;
}
unsigned int getaddr( char page)
{
char s[6],cnt,ch;
switch(page)
{
case 0:uart_write("\r\nEnter Buffer Address(0-1056): ");break;
case 1:uart_write("\r\nEnter Page Address(0-8190): ");break;
case 2:uart_write("\r\nEnter number of Bytes(0-10): ");break;
case 3:uart_write("\r\nEnter Block Address(0-1023): ");break;
case 4:uart_write("\r\nEnter Sector Address(0-31): ");break;
case 5:uart_write("\r\nSelect 0-Sector0a|1-Sector0b: ");break;
}
for(cnt=0,ch=0;ch!=0x0d;cnt++)
{
ch=s[cnt]=uart_read(); //getting address from the user
}
cnt--;
s[cnt]='\0';
uart_write(s);
return atoi(s);
}
void main()
{
unsigned char buffer[10],asciibuffer[10];
char ch;
DATAFLASH flashvar;
P2DIR|=0x01;
P3SEL=0X30;
P3DIR=0x70;
ME1=0XC0;
U0CTL=0X10;
U0TCTL=0X18;
U0RCTL=0X00;
U0BR0=0X03; /* 9600 baud rate*/
U0BR1=0X00;
U0MCTL=0X4A; /*modulation control register*/
// uart_write(uart_read());
uart_write("Interfacing Dataflash Card with MSP430F169:\r\n"); //title
while(1)
{
uart_write("Enter choice :\r\n0-Manufacture ID\r\n1-Write to Dataflash through buffer-1\r\n2-Write to Dataflash through buffer-2\r\n3-Continous read");
ch=uart_read()-'0'; //getting the choice
flashvar.command=command[ch]; //loading opcode and intializing variables in the structure
flashvar.bufferptr=&buffer[0];
flashvar.finish=0;
flashvar.count=0;
if(!ch)
{
flashvar.pageaddr=0;
flashvar.bufaddr=0;
flashvar.dontcare=4;
flashvar.noofbytes=4;
}
else
{
flashvar.pageaddr=getaddr(1); //getting page address from user
if(ch!=4)
{
flashvar.bufaddr=getaddr(0); //getting buffer/byte address from user
flashvar.noofbytes=getaddr(2); //getting no of bytes from user
}
if(ch==1||ch==2)
{
uart_write("\r\nEnter Data:");
for(flashvar.count=0;ch!=0x0d;flashvar.count++)
ch=buffer[flashvar.count]=uart_read(); //getting data to be written
flashvar.noofbytes= (--flashvar.count);
buffer[flashvar.noofbytes]=0;
flashvar.count=0;
}
flashvar.dontcare=0;
}
P5OUT|=0x01;
AT45DCB008D(&flashvar);
if(flashvar.command==command[0])
{
// toascii(&flashvar,&asciibuffer[0]); //converting raw data to ascii values
uart_write(&asciibuffer[0]); //displaying to uart
}
else
{
uart_write(&buffer[0]); //displaying to uart
}
uart_write("\r\n");
delay(flashvar.timeval); //to
}
}