Александр Селифонов
/
Nucleo_i2c_master
11
main.cpp@0:51d7f8d33957, 2018-08-20 (annotated)
- Committer:
- turumputum
- Date:
- Mon Aug 20 17:44:43 2018 +0000
- Revision:
- 0:51d7f8d33957
122
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
turumputum | 0:51d7f8d33957 | 1 | #include "mbed.h" |
turumputum | 0:51d7f8d33957 | 2 | |
turumputum | 0:51d7f8d33957 | 3 | |
turumputum | 0:51d7f8d33957 | 4 | int address = 0xA0; |
turumputum | 0:51d7f8d33957 | 5 | |
turumputum | 0:51d7f8d33957 | 6 | |
turumputum | 0:51d7f8d33957 | 7 | DigitalOut VCC(PB_5); |
turumputum | 0:51d7f8d33957 | 8 | DigitalOut GND(PB_13); |
turumputum | 0:51d7f8d33957 | 9 | I2C i2c(PB_4, PA_8); |
turumputum | 0:51d7f8d33957 | 10 | |
turumputum | 0:51d7f8d33957 | 11 | DigitalOut myled(LED1); |
turumputum | 0:51d7f8d33957 | 12 | |
turumputum | 0:51d7f8d33957 | 13 | Serial pc(SERIAL_TX, SERIAL_RX); |
turumputum | 0:51d7f8d33957 | 14 | |
turumputum | 0:51d7f8d33957 | 15 | |
turumputum | 0:51d7f8d33957 | 16 | void writeEEPROM(int address, unsigned int eeaddress, char *data, int size); |
turumputum | 0:51d7f8d33957 | 17 | void readEEPROM(int address, unsigned int eeaddress, char *data, int size); |
turumputum | 0:51d7f8d33957 | 18 | |
turumputum | 0:51d7f8d33957 | 19 | |
turumputum | 0:51d7f8d33957 | 20 | // this function has 63 bytes write limit |
turumputum | 0:51d7f8d33957 | 21 | void writeEEPROM(int address, unsigned int eeaddress, char *data, int size) |
turumputum | 0:51d7f8d33957 | 22 | { |
turumputum | 0:51d7f8d33957 | 23 | char i2cBuffer[size + 2]; |
turumputum | 0:51d7f8d33957 | 24 | i2cBuffer[0] = (unsigned char)(eeaddress >> 8); // MSB |
turumputum | 0:51d7f8d33957 | 25 | i2cBuffer[1] = (unsigned char)(eeaddress & 0xFF); // LSB |
turumputum | 0:51d7f8d33957 | 26 | |
turumputum | 0:51d7f8d33957 | 27 | for (int i = 0; i < size; i++) { |
turumputum | 0:51d7f8d33957 | 28 | i2cBuffer[i + 2] = data[i]; |
turumputum | 0:51d7f8d33957 | 29 | } |
turumputum | 0:51d7f8d33957 | 30 | |
turumputum | 0:51d7f8d33957 | 31 | int result = i2c.write(address, i2cBuffer, size + 2, false); |
turumputum | 0:51d7f8d33957 | 32 | wait_ms(6); |
turumputum | 0:51d7f8d33957 | 33 | } |
turumputum | 0:51d7f8d33957 | 34 | |
turumputum | 0:51d7f8d33957 | 35 | // this function has no read limit |
turumputum | 0:51d7f8d33957 | 36 | void readEEPROM(int address, unsigned int eeaddress, char *data, int size) |
turumputum | 0:51d7f8d33957 | 37 | { |
turumputum | 0:51d7f8d33957 | 38 | char i2cBuffer[2]; |
turumputum | 0:51d7f8d33957 | 39 | i2cBuffer[0] = (unsigned char)(eeaddress >> 8); // MSB |
turumputum | 0:51d7f8d33957 | 40 | i2cBuffer[1] = (unsigned char)(eeaddress & 0xFF); // LSB |
turumputum | 0:51d7f8d33957 | 41 | |
turumputum | 0:51d7f8d33957 | 42 | // Reset eeprom pointer address |
turumputum | 0:51d7f8d33957 | 43 | int result = i2c.write(address, i2cBuffer, 2, false); |
turumputum | 0:51d7f8d33957 | 44 | wait_ms(6); |
turumputum | 0:51d7f8d33957 | 45 | |
turumputum | 0:51d7f8d33957 | 46 | // Read eeprom |
turumputum | 0:51d7f8d33957 | 47 | i2c.read(address, data, size); |
turumputum | 0:51d7f8d33957 | 48 | wait_ms(6); |
turumputum | 0:51d7f8d33957 | 49 | } |
turumputum | 0:51d7f8d33957 | 50 | |
turumputum | 0:51d7f8d33957 | 51 | |
turumputum | 0:51d7f8d33957 | 52 | int main() |
turumputum | 0:51d7f8d33957 | 53 | { |
turumputum | 0:51d7f8d33957 | 54 | |
turumputum | 0:51d7f8d33957 | 55 | VCC=1; |
turumputum | 0:51d7f8d33957 | 56 | GND=0; |
turumputum | 0:51d7f8d33957 | 57 | |
turumputum | 0:51d7f8d33957 | 58 | pc.printf("I2C EEPROM started...\n"); |
turumputum | 0:51d7f8d33957 | 59 | |
turumputum | 0:51d7f8d33957 | 60 | int pointerAdddress = 0; |
turumputum | 0:51d7f8d33957 | 61 | |
turumputum | 0:51d7f8d33957 | 62 | wait_ms(3000); |
turumputum | 0:51d7f8d33957 | 63 | |
turumputum | 0:51d7f8d33957 | 64 | // write some data on eeprom |
turumputum | 0:51d7f8d33957 | 65 | char writeData[] = {"1234567890"}; // the text length must be below 64 bytes |
turumputum | 0:51d7f8d33957 | 66 | char writeDataLen = 0; |
turumputum | 0:51d7f8d33957 | 67 | do {writeDataLen++;} while (writeData[writeDataLen]); // calculate the text length |
turumputum | 0:51d7f8d33957 | 68 | |
turumputum | 0:51d7f8d33957 | 69 | writeEEPROM(address, pointerAdddress, writeData, writeDataLen); |
turumputum | 0:51d7f8d33957 | 70 | |
turumputum | 0:51d7f8d33957 | 71 | pc.printf("Data written: %s\n", writeData); |
turumputum | 0:51d7f8d33957 | 72 | |
turumputum | 0:51d7f8d33957 | 73 | |
turumputum | 0:51d7f8d33957 | 74 | // read the data back |
turumputum | 0:51d7f8d33957 | 75 | char data_read[writeDataLen]; |
turumputum | 0:51d7f8d33957 | 76 | readEEPROM(address, pointerAdddress, data_read, writeDataLen); |
turumputum | 0:51d7f8d33957 | 77 | |
turumputum | 0:51d7f8d33957 | 78 | pc.printf("Data read: %s\n", data_read); |
turumputum | 0:51d7f8d33957 | 79 | } |
turumputum | 0:51d7f8d33957 | 80 |