![](/media/cache/profiles/a532400ed62e772b9dc0b86f46e583ff.50x50_q85.jpg)
This is a complete listing of the RS-EDP software for the mbed module to support the RS-EDP platform.
Diff: SourceFiles/RSEDP_BB_24LC32_Serial_EEPROM.cpp
- Revision:
- 0:5b7639d1f2c4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SourceFiles/RSEDP_BB_24LC32_Serial_EEPROM.cpp Fri Nov 19 09:49:16 2010 +0000 @@ -0,0 +1,159 @@ +/* Serial EEPROM I2C Type 24LC32 C Source Code Driver File */ +/* ******************************************************* */ + +/* Version 1.00 */ +/* Start Date: 25/2/2008 */ + + + +/* Include Files Here */ +#include "mbed.h" /* mbed header file */ +#include "misra_types.h" /* MISRA Types header file */ +#include "defines.h" +#include "mbed_Port_Structure.h" /* Port structure for MBED Module */ + +#include "RSEDP_CNTRL_I2C.h" /* Control I2C Driver */ + + + +/* Function Prototypes Here */ +sint32_t RSEDP_BB_setup_24LC32(uint8_t Slave_Address); /* Configure the I2C EEPROM */ +sint32_t RSEDP_BB_eeprom_store_byte(uint8_t Slave_Address, sint8_t payload, uint16_t eeaddress); /* Write one byte to one memory location */ +sint32_t RSEDP_BB_eeprom_store_bytes(uint8_t Slave_Address, sint8_t *payload, uint8_t qty, uint16_t eeaddress); /* Called by main to write multiple bytes to the serial EEPROM */ +sint32_t RSEDP_BB_eeprom_read_byte(uint8_t Slave_Address, sint8_t *read_value, uint16_t eeaddress); /* Read one byte from one location */ +sint32_t RSEDP_BB_eeprom_read_bytes(uint8_t Slave_Address, sint8_t *payload, uint16_t qty, uint16_t eeaddress); /* Read several byte from one location */ + +static void delay_small(void); /* Local static 1us delay routine */ + + + + +/* Setup the serial interface to the EEPROM */ +sint32_t RSEDP_BB_setup_24LC32(uint8_t Slave_Address) /* Configure the 24LC32 */ + { + sint32_t Ack_Status = 0; + /* Assume the I2C bus is already configured. This is normally done on mbed_Port_Structure.c */ + + Ack_Status = CNTRL_I2C_Master_Mode_Transmit(Slave_Address, 0, 1); /* Ping the device */ + return Ack_Status; + } + + + + + + + +/* Store one byte at one address location */ +sint32_t RSEDP_BB_eeprom_store_byte(uint8_t Slave_Address, sint8_t payload, uint16_t eeaddress) /* Write one byte to one memory location */ + { + sint32_t Ack_Status = 0; + sint8_t tx_array[3]; /* two byte array used to hold transmission packet */ + + eeaddress = (eeaddress & 0x0fff); /* Ensure address is not more than 12 bit */ + + tx_array[0] = (uint8_t) (eeaddress >> 8); /* Extract high part */ + tx_array[1] = (uint8_t) eeaddress; /* Extract Low address */ + tx_array[2] = payload; /* second member of array is the value to be stored */ + + Ack_Status = CNTRL_I2C_Master_Mode_Transmit(Slave_Address, tx_array, 3); /* Send a data packet to a slave, record acknowledge bit */ + delay_small(); + return Ack_Status; + + } + + + +/* Write upto 32 bytes into the EEPROM all at once */ +sint32_t RSEDP_BB_eeprom_store_bytes(uint8_t Slave_Address, sint8_t *payload, uint8_t qty, uint16_t eeaddress) /* Called by main to write multiple bytes to the serial EEPROM */ + { + sint32_t Ack_Status = 0; + uint8_t n=0; /* Scratch pad variable */ + sint8_t tx_array[34]; /* transmission array */ + + eeaddress = (eeaddress & 0x0fff); /* Cap range to 12 bit address */ + + tx_array[0]=(uint8_t) (eeaddress >> 8); /* Extract high address byte */ + tx_array[1]=(uint8_t) eeaddress; /* Extract Low address */ + + for (n = 2; n < (qty + 2); n++) /* Copy the transmission data into a local array */ + { + tx_array[n] = *payload; + payload++; + } + + Ack_Status = CNTRL_I2C_Master_Mode_Transmit(Slave_Address, tx_array, (qty+2)); /* Send data out on I2C bus */ + delay_small(); /* EEPROM Busy period - self timed */ + return Ack_Status; + } + + + + +/* Read One Byte From An Address */ +sint32_t RSEDP_BB_eeprom_read_byte(uint8_t Slave_Address, sint8_t *payload, uint16_t eeaddress) /* Read one byte from one location */ + { + sint32_t Ack_Status = 0; + sint8_t tx_array[3]; + sint8_t rx_array = 0; /* Variable used to receive data from slave */ + + eeaddress = (eeaddress & 0x0fff); /* Cap address to 12 bit */ + + tx_array[0] = (uint8_t) (eeaddress >> 8); /* Extract high order byte */ + tx_array[1] = (uint8_t) eeaddress; /* Extract low address */ + + Ack_Status = CNTRL_I2C_Master_Mode_Transmit(Slave_Address, tx_array, 2); /* Set the EEPROM address */ + +// delay_small(); /* EEPROM is busy writing */ + + if (Ack_Status == ACK) + { + Ack_Status = CNTRL_I2C_Master_Mode_Receive(Slave_Address, &rx_array,1); /* Read single byte address */ + } + + *payload = rx_array; /* Load value from EEPROM into receive pointer */ + return Ack_Status; + + } + + +/* Read several byte from the memory location */ +sint32_t RSEDP_BB_eeprom_read_bytes(uint8_t Slave_Address, sint8_t *payload, uint16_t qty, uint16_t eeaddress) + { + sint32_t Ack_Status = 0; + sint8_t tx_array[3]; + uint8_t address_low = 0; /* EEPROM high address byte */ + uint8_t address_high = 0; /* EEPROM low address byte */ + + eeaddress = (eeaddress & 0x0fff); /* Cap to 12 bit address */ + address_high = (uint8_t) (eeaddress >> 8); /* Extract high order address byte */ + address_low = (uint8_t) eeaddress; /* Extract Low address byte */ + + tx_array[0] = address_high; /* first member of array is the EEPROM high address */ + tx_array[1] = address_low; /* Low byte next */ + + Ack_Status = CNTRL_I2C_Master_Mode_Transmit(Slave_Address, tx_array, 2); /* Set the EEPROM address */ + + delay_small(); /* Write time delay busy period */ + + if (Ack_Status == ACK) + { + Ack_Status = CNTRL_I2C_Master_Mode_Receive(Slave_Address, payload, qty); /* Read address */ + } + return Ack_Status; + } + + + +/* Small 5ms delay approx */ +/* Note: Change this delay to suite the write time/busy period of the EEPROM */ +static void delay_small(void) +{ + uint32_t nnnn = 0; + + for(nnnn = 0; nnnn < 0x6000; nnnn++) + { + ; + } +} +