Other Parts Discussed in Thread: MSP430G2452
Hi, Please help with memory MR25H10. It's MRAM but communication should be the same as other SPI memory (EEPROM, Flash...). Do not know where my mistake? Thank you.
#include <msp430g2452.h>
#define MR25H10_DIR P2DIR
#define MR25H10_OUT P2OUT
#define MR25H10_HOLD BIT0
#define MR25H10_SCK BIT1
#define MR25H10_SI BIT2
#define MR25H10_WP BIT3
#define MR25H10_SO BIT4
#define MR25H10_CS BIT5
#define Write_enable 00000110
#define Write_disable 00000100
#define Read_status_register 00000101
#define Write_status_register 00000001
#define Read_data_bytes 00000011
#define Write_data_bytes 00000010
#define Enter_sleep_mode 10111001
#define Exit_sleep_mode 10101011
unsigned char MR25H10_ReadData;
void MR25H10_Init(void);
void MR25H10_Pulse(void);
void MR25H10_Write_bytes(unsigned char WriteBytes);
void MR25H10_Write_data (unsigned char Adress, unsigned char Write_Data);
void MR25H10_Read(unsigned char Adress);
void MR25H10_Init(void)
{
MR25H10_OUT &= ~(MR25H10_SCK|MR25H10_SI|MR25H10_SO|MR25H10_CS);
MR25H10_DIR |=(MR25H10_SCK|MR25H10_SO|MR25H10_CS|MR25H10_SI);
}
void MR25H10_Pulse(void) //Only for pin test
{
MR25H10_OUT |= MR25H10_SCK; //Pulse rising edge
__delay_cycles(1000);
MR25H10_OUT &= (~MR25H10_SCK); //Pulse falling edge
__delay_cycles(1000);
}
void MR25H10_Write_bytes(unsigned char WriteBytes)
{
unsigned char W_BitCount;
for(W_BitCount=0;W_BitCount<8;W_BitCount++)
{
if((WriteBytes<<W_BitCount)&0x80)
{
MR25H10_OUT |= MR25H10_SI; //SI high
__delay_cycles(50);
}
else
{
MR25H10_OUT &= (~MR25H10_SI); //SI low
__delay_cycles(50);
}
MR25H10_OUT &= (~MR25H10_SCK); //Pulse falling edge
__delay_cycles(50);
MR25H10_OUT |= MR25H10_SCK; //Pulse rising edge
__delay_cycles(50);
}
}
void MR25H10_Write_data (unsigned char Adress, unsigned char Data_for_write)
{
MR25H10_OUT &= (~MR25H10_CS); //Chip select low = enable
__delay_cycles(50);
MR25H10_Write_bytes(Write_enable); //Write enable instruction
MR25H10_OUT |= MR25H10_CS; //Chip select high = disable
__delay_cycles(50);
MR25H10_OUT &= (~MR25H10_CS); //Chip select low = enable
__delay_cycles(50);
MR25H10_Write_bytes(Write_data_bytes); //Send write instruction
MR25H10_Write_bytes(Adress); //Send address
MR25H10_Write_bytes(Data_for_write); //Send data
MR25H10_OUT |= MR25H10_CS; //Chip select high = disable
__delay_cycles(50);
}
void MR25H10_Read(unsigned char Adress)
{
unsigned char R_BitCount;
MR25H10_ReadData = 0;
MR25H10_OUT &= (~MR25H10_CS); //Chip select low = enable
__delay_cycles(50);
MR25H10_Write_bytes(Write_enable); //Write enable instruction
MR25H10_OUT |= MR25H10_CS; //Chip select high = disable
__delay_cycles(50);
MR25H10_OUT &= (~MR25H10_CS); //Chip select low = enable
__delay_cycles(50);
MR25H10_Write_bytes(Read_data_bytes); //Send read instruction
MR25H10_Write_bytes(Adress>>8);
MR25H10_Write_bytes(Adress); //Send address
for(R_BitCount=0;R_BitCount<8;R_BitCount++)
{
MR25H10_ReadData<<=1;
MR25H10_OUT &= (~MR25H10_SCK); //Pulse falling edge
__delay_cycles(50);
MR25H10_OUT |= MR25H10_SCK; //Pulse rising edge
__delay_cycles(50);
if(P2IN&MR25H10_SO)
{
MR25H10_ReadData++;
}
else
{
_NOP();
}
}
MR25H10_OUT |= MR25H10_CS; //Chip select high = disable
__delay_cycles(50);
return(MR25H10_ReadData);
}