n-Blocks-HALL / RM25C512C-L_driver
Revision:
1:67d99e4ce310
Parent:
0:890f322344f2
Child:
2:183d1d96f917
diff -r 890f322344f2 -r 67d99e4ce310 rm25c512cl.cpp
--- a/rm25c512cl.cpp	Wed Sep 05 16:04:45 2018 +0000
+++ b/rm25c512cl.cpp	Wed Sep 12 12:14:39 2018 +0000
@@ -2,36 +2,222 @@
 
 
 rm25c512cl::rm25c512cl(PinName MOSI,PinName MISO,PinName SCLK,PinName CS): _spi(MOSI,MISO,SCLK),_cs(CS){
-    
+   
+   _cs = 1; // always set chip select to initial state of high 
     
 }
 
+/**
+* @brief    write_enable()
+* @details  Sets write enable latch to 1 to enable writing to eeprom uses the WREN opcode
+* @param    NA
+* @return   NA
+* @warning  Write or erase instructions will be ignored if this instruction is not issued first
+* 
+*/
+
 void rm25c512cl :: write_enable(){
     
+    char cmd[1];
+    char data_buffer[1];// not used here but required for spi.write() as a parameter
+    
+    cmd[0] = WREN;
+    
+    _spi.lock();
+      
+    _cs = 0;
+    
+    _spi.write(&cmd[0],1,&data_buffer[0],0);
+        
+    _cs = 1;
+    
+    _spi.unlock();
+    
+    wait_us(20);   
+    
     
     
 }
 
-void rm25c512cl :: read_status_reg(){
+/**
+* @brief    read_status_reg()
+* @details  Reads the status register of EEprom using the RDSR opcode, the register 
+*           read can be used to determine if a write has completed, or the write protection status
+* @param    NA
+* @return   Current eight bit value of register
+* @warning  
+* 
+*/
+
+char  rm25c512cl :: read_status_reg(){
+    
+   char cmd[1];
+   char data_buffer[1]; // to store value returned from EEprom status register
+   
+       
+   cmd[0] = RDSR;
+    
+   _spi.lock();
+    
+   _cs = 0;
+    
+   _spi.write(&cmd[0],1,&data_buffer[0],0); 
+    
+   cmd[0] = 0xFF; // write garbage to read something back
+    
+   _spi.write(&cmd[0],1,&data_buffer[0],1);
+       
+   _cs = 1;
+    
+   _spi.unlock();
+    
+   wait_us(20);
+   
+   return data_buffer[0];
+       
+    
+}
+
+/**
+* @brief    write_bytes()
+* @details  Writes multiple bytes to the specified address given.
+* @param    Starting address to write to.
+* @param    Pointer to the data array containg bytes to be stored.
+* @return   NA
+* @warning  A page write(128 bytes) can take up to 5 ms to complete
+* 
+*/
+
+void rm25c512cl :: write_bytes(uint16_t address, char* data){
+    
+    char cmd[3];
+    char data_buffer[1];// not used here but required for spi.write() as a parameter
     
     
     
-}
-
-void rm25c512cl :: write_page(){
+    cmd[0] = WR;
+    cmd[1] = address >> 8;
+    cmd[2] = address & 0x00FF;
+    
+    _spi.lock();
+    
+    _cs = 0;   
+    
+    _spi.write(&cmd[0],3,&data_buffer[0],0);
+    _spi.write(&data[0],sizeof(data),&data_buffer[0],0);
+  
+    _cs = 1;
+    
+    _spi.unlock();
+    
+    wait_ms(5); 
     
     
 }
 
-void rm25c512cl :: write_byte(){
+/**
+* @brief    write_byte()
+* @details  Writes a single byte to EEprom at the given address
+* @param    Address to write to
+* @param    Value to write in given address
+* @return   NA
+* @warning  Byte write can take up to 100 us to complete
+* 
+*/
+
+void rm25c512cl :: write_byte(uint16_t address,char value){
+    
+    char cmd[4];
+    char data_buffer[1]; // not used here but required for spi.write() as a parameter
+       
+    cmd[0] = WR;
+    cmd[1] = address >> 8;
+    cmd[2] = address & 0x00FF;
+    cmd[3] = value;
+    
+    _spi.lock();
+    
+    _cs = 0;   
+    
+    _spi.write(&cmd[0],4,&data_buffer[0],0);
+    
+    _cs =1;
+    
+    _spi.unlock();
+    
+    wait_us(100);
     
 }
 
-void rm25c512cl :: read_page(){
+/**
+* @brief    read_bytes()
+* @details  Reads page of data(128 bytes) at given address.
+* @param    Page Address to start reading from.
+* @param    Pointer to data buffer to store multiple bytes read from EEprom
+* @return   
+* @warning  Data buffer must be of size 128 bytes to read entire page.
+* 
+*/
+
+void rm25c512cl :: read_bytes(uint16_t address, char* data_buffer){
+    
+    char cmd[3];
+   
+    
+    cmd[0] = READ;
+    cmd[1] = address >> 8;
+    cmd[2] = address & 0x00FF;
+    
+    
+    _spi.lock();
+    
+    _cs = 0;
+    
+    _spi.write(&cmd[0],3,&data_buffer[0],0);
+    
+    cmd[0] = 0xFF;
+        
+    _spi.write(&cmd[0],1,&data_buffer[0],sizeof(data_buffer));
+      
+    _cs = 1;
+    
+    _spi.unlock();
     
     
 }
 
-void rm25c512cl :: read_byte(){
+/**
+* @brief    read_byte()
+* @details  Reads a byte of data at given address.
+* @param    Address to read byte from.
+* @return   Byte of data read from address.
+* @warning  
+* 
+*/
+
+char rm25c512cl :: read_byte(uint16_t address){
+    
+    char cmd[3];
+    char data_buffer[1];// To store data byte returned from EEprom
+    
+    cmd[0] = READ;
+    cmd[1] = address >> 8;
+    cmd[2] = address & 0x00FF;
+    
+    _spi.lock();
+    
+    _cs = 0;
+    
+    _spi.write(&cmd[0],3,&data_buffer[0],0);
+    
+    cmd[0] = 0xFF;
+    
+    _spi.write(&cmd[0],1,&data_buffer[0],1);
+    
+    _cs = 1;
+    
+    _spi.unlock();
+    
+    return data_buffer[0];
     
 }
\ No newline at end of file