hi all, I am a learner in MSP 430. I am working in GPS application project.I want to write some data in External serial flash memory through MSp430F149.I am using serial flash memory for data logging purpose from ST microelectronics part no M25P20.That serial flash connected in SPI mode control protocol thru MSP430F149.The serial flash data input line is connected to SIMO pin of MSP.The serial flash data out pin is connected to SOMI pin.How to write a data in to that serial flash in a particular location of serial flash. This is the hardware connection for the above appln. MSP430F149 ----------------- /|\| xt2in|- | | | 8MHz SERIAL FLASH M25P20 --|RST xt2OUT| - ------------- | | | P3.1|------>|CS | |SIMO0/P3.1|------>|DATAIN | |UCLK0/P3.3|------>|SCLK | |SOMI /P3.2|<------|DATAOUT | I have written the code as follows #include "msp430x14x.h" int SIGN,COUNT; void main(void) { unsigned I; int STATUS,BUFFER[300]; //buffer for storage int A=0; WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 &= ~XT2OFF; // XT2on do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (I = 0xFF; I > 0; I--); // Time for flag to set } while ((IFG1 & OFIFG)); // OSCFault flag still set? BCSCTL2 |= SELM_2 + SELS; // MCLK = SMCLK = XT2 (safe) for (I = 0xFFFF; I > 0; I--); // Delay //INITIALIZATION ME1 |= USPIE0;//module enable UCTL0 |= CHAR + SYNC + MM+ SWRST;// P3.1,2,3 SPI option select UTCTL0 |= CKPL+SSEL1+STC;// // Polarity, 3-wire UBR00 = 0x41;//8MHz clock rate with 9600 baud rate UBR10 = 0x03; UMCTL0 = 0x00; ME1 |= UTXE0 + URXE0;//tx&Rx interrupt enable UCTL0 &= ~SWRST; IE1 |= URXIE0; P6SEL |= 0x38; P6DIR |= 0x38; P6OUT = 0x30; //*********READ ELECTRONIC SIGNATUREcommand sequece is 1.send command 0xAB and three cummy byte *****************/ P3SEL = 0x0F; P3DIR = 0x0A; for(I=0xFFFF;I>0x0;I--); while(!(IFG1 & UTXIFG0)); TXBUF0 = 0xAB; //DUMMY BYTES while(!(IFG1 & UTXIFG0)); TXBUF0 = 0x00; while(!(IFG1 & UTXIFG0)); TXBUF0 = 0x10; while(!(IFG1 & UTXIFG0)); TXBUF0 = 0x10; _BIS_SR(GIE); for(;;) { if(COUNT==1) break; } P6OUT = 0x30 asm("nop;"); } #pragma vector=UART0RX_VECTOR __interrupt void usart0_rx (void) { SIGN = RXBUF0; if(SIGN==0x11||SIGN==0xB)//check for electronic signature 0X11 COUNT=1; } In the above program i made a mistake but i dont know what is the mistake.I got a result as 0x00 or 0xffh.any body can help me how to write a code to read electronic signature thru MSP430f149 . I am waiting for ur valuable guidance. Thanks &Regards Saravana
Interfacing serial flash with MSP430F149 for data logging
Started by ●February 22, 2005
Reply by ●February 22, 20052005-02-22
Check the specification from ST website.
For any operation you have to enable CS line (low) and then disable it
for example if your CS line is connected to P30:
#define SFCS_LOW P3OUT &= 0xfe // CS is P30
#define SFCS_HIGH P3OUT |= 0x01
SFCS_LOW // CS active
// you code here
SFCS_HIGH // CS inactive
Hope this will help
Jan
--- In msp430@msp4..., "saravana_friend81"
<saravana_friend81@y...> wrote:
>
> hi all,
> I am a learner in MSP 430. I am working in GPS application project.I
> want to write some data in External serial flash memory through
> MSp430F149.I am using serial flash memory for data logging purpose
> from ST microelectronics part no M25P20.That serial flash connected
> in SPI mode control protocol thru MSP430F149.The serial flash data
> input line is connected to SIMO pin of MSP.The serial flash data out
> pin is connected to SOMI pin.How to write a data in to that serial
> flash in a particular location of serial flash.
>
>
> This is the hardware connection for the above appln.
>
>
> MSP430F149
> -----------------
> /|\| xt2in|-
> | | | 8MHz SERIAL FLASH M25P20
> --|RST xt2OUT| - -------------
> | |
> | P3.1|------>|CS |
> |SIMO0/P3.1|------>|DATAIN |
> |UCLK0/P3.3|------>|SCLK |
> |SOMI /P3.2|<------|DATAOUT |
> I have written the code as follows
>
>
> #include "msp430x14x.h"
> int SIGN,COUNT;
>
>
>
> void main(void)
> {
> unsigned I;
> int STATUS,BUFFER[300]; //buffer for storage
> int A=0;
> WDTCTL = WDTPW + WDTHOLD; // Stop WDT
> BCSCTL1 &= ~XT2OFF; // XT2on
>
> do
> {
> IFG1 &= ~OFIFG; // Clear OSCFault flag
> for (I = 0xFF; I > 0; I--); // Time for flag to set
> }
> while ((IFG1 & OFIFG)); // OSCFault flag still
> set?
>
> BCSCTL2 |= SELM_2 + SELS; // MCLK = SMCLK = XT2 (safe)
>
>
> for (I = 0xFFFF; I > 0; I--); // Delay
>
>
> //INITIALIZATION
>
> ME1 |= USPIE0;//module enable
> UCTL0 |= CHAR + SYNC + MM+ SWRST;// P3.1,2,3 SPI option select
>
> UTCTL0 |= CKPL+SSEL1+STC;// // Polarity, 3-wire
> UBR00 = 0x41;//8MHz clock rate with 9600 baud rate
> UBR10 = 0x03;
> UMCTL0 = 0x00;
> ME1 |= UTXE0 + URXE0;//tx&Rx interrupt enable
> UCTL0 &= ~SWRST;
>
> IE1 |= URXIE0;
> P6SEL |= 0x38;
> P6DIR |= 0x38;
> P6OUT = 0x30;
> //*********READ ELECTRONIC SIGNATUREcommand sequece is 1.send
> command 0xAB and three cummy byte *****************/
> P3SEL = 0x0F;
> P3DIR = 0x0A;
> for(I=0xFFFF;I>0x0;I--);
>
> while(!(IFG1 & UTXIFG0));
> TXBUF0 = 0xAB;
> //DUMMY BYTES
> while(!(IFG1 & UTXIFG0));
>
> TXBUF0 = 0x00;
> while(!(IFG1 & UTXIFG0));
> TXBUF0 = 0x10;
> while(!(IFG1 & UTXIFG0));
> TXBUF0 = 0x10;
>
> _BIS_SR(GIE);
> for(;;)
> {
> if(COUNT==1)
> break;
>
> }
> P6OUT = 0x30
> asm("nop;");
> }
>
> #pragma vector=UART0RX_VECTOR
> __interrupt void usart0_rx (void)
> {
> SIGN = RXBUF0;
> if(SIGN==0x11||SIGN==0xB)//check for electronic signature 0X11
> COUNT=1;
> }
>
> In the above program i made a mistake but i dont know what is the
> mistake.I got a result as 0x00 or 0xffh.any body can help me how to
> write a code to read electronic signature thru MSP430f149 . I am
> waiting for ur valuable guidance.
> Thanks &Regards
> Saravana
Reply by ●February 23, 20052005-02-23
hi jan already i do that in correct way.first i enabled chip enable and then i write a program to read electronics signature of flash.Then i have some problem in my code.can any body help me. thanks®ards saravana --- In msp430@msp4..., "Jan Szymanski" <janek@b...> wrote: > > Check the specification from ST website. > For any operation you have to enable CS line (low) and then disable it > for example if your CS line is connected to P30: > #define SFCS_LOW P3OUT &= 0xfe // CS is P30 > #define SFCS_HIGH P3OUT |= 0x01 > > SFCS_LOW // CS active > // you code here > SFCS_HIGH // CS inactive > Hope this will help > Jan > > > --- In msp430@msp4..., "saravana_friend81" > <saravana_friend81@y...> wrote: > > > > hi all, > > I am a learner in MSP 430. I am working in GPS application project.I > > want to write some data in External serial flash memory through > > MSp430F149.I am using serial flash memory for data logging purpose > > from ST microelectronics part no M25P20.That serial flash connected > > in SPI mode control protocol thru MSP430F149.The serial flash data > > input line is connected to SIMO pin of MSP.The serial flash data out > > pin is connected to SOMI pin.How to write a data in to that serial > > flash in a particular location of serial flash. > > > > > > This is the hardware connection for the above appln. > > > > > > MSP430F149 > > ----------------- > > /|\| xt2in|- > > | | | 8MHz SERIAL FLASH M25P20 > > --|RST xt2OUT| - ------------- > > | | > > | P3.1|------>|CS | > > |SIMO0/P3.1|------>|DATAIN | > > |UCLK0/P3.3|------>|SCLK | > > |SOMI /P3.2|<------|DATAOUT | > > I have written the code as follows > > > > > > #include "msp430x14x.h" > > int SIGN,COUNT; > > > > > > > > void main(void) > > { > > unsigned I; > > int STATUS,BUFFER[300]; //buffer for storage > > int A=0; > > WDTCTL = WDTPW + WDTHOLD; // Stop WDT > > BCSCTL1 &= ~XT2OFF; // XT2on > > > > do > > { > > IFG1 &= ~OFIFG; // Clear OSCFault flag > > for (I = 0xFF; I > 0; I--); // Time for flag to set > > } > > while ((IFG1 & OFIFG)); // OSCFault flag still > > set? > > > > BCSCTL2 |= SELM_2 + SELS; // MCLK = SMCLK = XT2 (safe) > > > > > > for (I = 0xFFFF; I > 0; I--); // Delay > > > > > > //INITIALIZATION > > > > ME1 |= USPIE0;//module enable > > UCTL0 |= CHAR + SYNC + MM+ SWRST;// P3.1,2,3 SPI option select > > > > UTCTL0 |= CKPL+SSEL1+STC;// // Polarity, 3-wire > > UBR00 = 0x41;//8MHz clock rate with 9600 baud rate > > UBR10 = 0x03; > > UMCTL0 = 0x00; > > ME1 |= UTXE0 + URXE0;//tx&Rx interrupt enable > > UCTL0 &= ~SWRST; > > > > IE1 |= URXIE0; > > P6SEL |= 0x38; > > P6DIR |= 0x38; > > P6OUT = 0x30; > > //*********READ ELECTRONIC SIGNATUREcommand sequece is 1.send > > command 0xAB and three cummy byte *****************/ > > P3SEL = 0x0F; > > P3DIR = 0x0A; > > for(I=0xFFFF;I>0x0;I--); > > > > while(!(IFG1 & UTXIFG0)); > > TXBUF0 = 0xAB; > > //DUMMY BYTES > > while(!(IFG1 & UTXIFG0)); > > > > TXBUF0 = 0x00; > > while(!(IFG1 & UTXIFG0)); > > TXBUF0 = 0x10; > > while(!(IFG1 & UTXIFG0)); > > TXBUF0 = 0x10; > > > > _BIS_SR(GIE); > > for(;;) > > { > > if(COUNT==1) > > break; > > > > } > > P6OUT = 0x30 > > asm("nop;"); > > } > > > > #pragma vector=UART0RX_VECTOR > > __interrupt void usart0_rx (void) > > { > > SIGN = RXBUF0; > > if(SIGN==0x11||SIGN==0xB)//check for electronic signature 0X11 > > COUNT=1; > > } > > > > In the above program i made a mistake but i dont know what is the > > mistake.I got a result as 0x00 or 0xffh.any body can help me how to > > write a code to read electronic signature thru MSP430f149 . I am > > waiting for ur valuable guidance. > > Thanks &Regards > > Saravana
Reply by ●February 23, 20052005-02-23
hi, please check with the CRO the levels and activity on all pins - the easiest way to do it is to read ID in a loop. the code which works for me is (ID function only and remember you have different port lines): /* USART0 used as master SPI */ /* 8MHz/2=4MHz */ /* enable USART module */ //ME1 |= 0x40; /* 01000000 - USPIE0=1 */ U0CTL|=0x01; /* set SWRST */ U0MCTL=0; U0BR0=0x02; U0BR1=0x00; /* select SIMO0 for P31/SIMO0 */ /* SOMI0 for P32/SOMI0 */ /* UCLK0 for P33/UCLK0 */ P3SEL|=0x0e; /* 0000 1110 */ /* USART Control Register */ U0CTL=0x17; /* 00010111 */ /* ||||||||_____ SWRST=1 */ /* |||||||______ MM=1 Master mode */ /* ||||||_______ SYNC=1, SPI mode */ /* |||||________ Listen=0 */ /* ||||_________ CHAR=1, 8bit */ /* |||__________ unused */ /* ||___________ unused */ /* |____________ unused */ /* Transmit Control Register */ //WASU1TCTL=0xf2; /* 11110010 */ U0TCTL=0x32; /* 00110010 */ /* ||||||||_____ TXEPT=0 */ /* |||||||______ STC=1 3-pin SPI */ /* ||||||_______ unused */ /* |||||________ unused */ /* ||||_________ SSEL1 SSEL0 clock for baud is SMCLK */ /* ||___________ CKPL=0 inactive clock level low, data out on rising edge */ /* |____________ CKPH=0 */ /* Receive Control Register */ U0RCTL=0x00; /* 00000000 */ /* ||||||||_____ RXERR=0 */ /* |||||||______ RXWake=0 */ /* ||||||_______ URXWIE=0 */ /* |||||________ URXEIE=0 */ /* ||||_________ BRK=0 */ /* |||__________ OE=0 */ /* ||___________ PE=0 */ /* |____________ FE=0 */ /* enable USART module */ ME1 |= 0x40; /* 01000000 - USPIE0=1 */ U0CTL&=0xfe; /* clear SWRST */ /* RX interrupt is used */ IE1=0x40; /* 01000000 */ /* ||||||||_____ NU */ /* |||||||______ NU */ /* ||||||_______ NU */ /* |||||________ NU */ /* ||||_________ NU */ /* |||__________ NU */ /* ||___________ URXIE0 */ /* |____________ UTXIE0 */ /* Instruction Set */ #define WREN 0x06 /* Write Enable */ #define WRDI 0x04 /* Write Disable */ #define RDSR 0x05 /* Read Status Register */ #define WRSR 0x01 /* Write Status Register */ #define READ 0x03 /* Read Data Bytes */ #define FAST_READ 0x0b /* Read Data Bytes at Higher Speed */ #define PP 0x02 /* Page Program */ #define SE 0xd8 /* Sector Erase */ #define BE 0xc7 /* Bulk Erase */ #define DP 0xb9 /* Deep Power Down */ #define RES 0xab /* Release from Deep Power-down */ /*********************************************************/ /* Name : SF_readID_SPI */ /* Parameters : none */ /* Returns : signature byte */ /* Scope : */ /* Function : to identify Serial flash */ /*********************************************************/ unsigned char SF_readID_SPI(void) { unsigned char c; P2OUT &= 0x7f; /* 0111 1111 P27 active low */ putchar_uart0(READ); /* instruction */ putchar_uart0(0xff); /* 3 dummy bytes */ putchar_uart0(0xff); putchar_uart0(0xff); putchar_uart0(0xff); /* generate clock to read ID */ c=getchar_uart0(); c=getchar_uart0(); c=getchar_uart0(); c=getchar_uart0(); c=getchar_uart0(); P2OUT |= 0x80; /* 1000 0000 P27 inactive high */ return c; } /* End of SF_readID_SPI **********************************/ Hope it will help Jan --- In msp430@msp4..., "saravana_friend81" <saravana_friend81@y...> wrote: > > hi jan > already i do that in correct way.first i enabled chip enable and > then i write a program to read electronics signature of flash.Then i > have some problem in my code.can any body help me. > thanks®ards > saravana > > > --- In msp430@msp4..., "Jan Szymanski" <janek@b...> wrote: > > > > Check the specification from ST website. > > For any operation you have to enable CS line (low) and then > disable it > > for example if your CS line is connected to P30: > > #define SFCS_LOW P3OUT &= 0xfe // CS is P30 > > #define SFCS_HIGH P3OUT |= 0x01 > > > > SFCS_LOW // CS active > > // you code here > > SFCS_HIGH // CS inactive > > Hope this will help > > Jan > > > > > > --- In msp430@msp4..., "saravana_friend81" > > <saravana_friend81@y...> wrote: > > > > > > hi all, > > > I am a learner in MSP 430. I am working in GPS application > project.I > > > want to write some data in External serial flash memory through > > > MSp430F149.I am using serial flash memory for data logging > purpose > > > from ST microelectronics part no M25P20.That serial flash > connected > > > in SPI mode control protocol thru MSP430F149.The serial flash > data > > > input line is connected to SIMO pin of MSP.The serial flash data > out > > > pin is connected to SOMI pin.How to write a data in to that > serial > > > flash in a particular location of serial flash. > > > > > > > > > This is the hardware connection for the above appln. > > > > > > > > > MSP430F149 > > > ----------------- > > > /|\| xt2in|- > > > | | | 8MHz SERIAL FLASH M25P20 > > > --|RST xt2OUT| - ------------- > > > | | > > > | P3.1|------>|CS | > > > |SIMO0/P3.1|------>|DATAIN | > > > |UCLK0/P3.3|------>|SCLK | > > > |SOMI /P3.2|<------|DATAOUT | > > > I have written the code as follows > > > > > > > > > #include "msp430x14x.h" > > > int SIGN,COUNT; > > > > > > > > > > > > void main(void) > > > { > > > unsigned I; > > > int STATUS,BUFFER[300]; //buffer for storage > > > int A=0; > > > WDTCTL = WDTPW + WDTHOLD; // Stop WDT > > > BCSCTL1 &= ~XT2OFF; // XT2on > > > > > > do > > > { > > > IFG1 &= ~OFIFG; // Clear OSCFault flag > > > for (I = 0xFF; I > 0; I--); // Time for flag to set > > > } > > > while ((IFG1 & OFIFG)); // OSCFault flag still > > > set? > > > > > > BCSCTL2 |= SELM_2 + SELS; // MCLK = SMCLK = XT2 (safe) > > > > > > > > > for (I = 0xFFFF; I > 0; I--); // Delay > > > > > > > > > //INITIALIZATION > > > > > > ME1 |= USPIE0;//module enable > > > UCTL0 |= CHAR + SYNC + MM+ SWRST;// P3.1,2,3 SPI option select > > > > > > UTCTL0 |= CKPL+SSEL1+STC;// // Polarity, 3-wire > > > UBR00 = 0x41;//8MHz clock rate with 9600 baud rate > > > UBR10 = 0x03; > > > UMCTL0 = 0x00; > > > ME1 |= UTXE0 + URXE0;//tx&Rx interrupt enable > > > UCTL0 &= ~SWRST; > > > > > > IE1 |= URXIE0; > > > P6SEL |= 0x38; > > > P6DIR |= 0x38; > > > P6OUT = 0x30; > > > //*********READ ELECTRONIC SIGNATUREcommand sequece is 1.send > > > command 0xAB and three cummy byte *****************/ > > > P3SEL = 0x0F; > > > P3DIR = 0x0A; > > > for(I=0xFFFF;I>0x0;I--); > > > > > > while(!(IFG1 & UTXIFG0)); > > > TXBUF0 = 0xAB; > > > //DUMMY BYTES > > > while(!(IFG1 & UTXIFG0)); > > > > > > TXBUF0 = 0x00; > > > while(!(IFG1 & UTXIFG0)); > > > TXBUF0 = 0x10; > > > while(!(IFG1 & UTXIFG0)); > > > TXBUF0 = 0x10; > > > > > > _BIS_SR(GIE); > > > for(;;) > > > { > > > if(COUNT==1) > > > break; > > > > > > } > > > P6OUT = 0x30 > > > asm("nop;"); > > > } > > > > > > #pragma vector=UART0RX_VECTOR > > > __interrupt void usart0_rx (void) > > > { > > > SIGN = RXBUF0; > > > if(SIGN==0x11||SIGN==0xB)//check for electronic signature 0X11 > > > COUNT=1; > > > } > > > > > > In the above program i made a mistake but i dont know what is the > > > mistake.I got a result as 0x00 or 0xffh.any body can help me how > to > > > write a code to read electronic signature thru MSP430f149 . I am > > > waiting for ur valuable guidance. > > > Thanks &Regards > > > Saravana