24FC1025
EEPROM_24FC1025.cpp@0:d6cc210c71cc, 2017-03-13 (annotated)
- Committer:
- Gaku0606
- Date:
- Mon Mar 13 07:03:05 2017 +0000
- Revision:
- 0:d6cc210c71cc
??;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Gaku0606 | 0:d6cc210c71cc | 1 | #include "EEPROM_24FC1025.h" |
Gaku0606 | 0:d6cc210c71cc | 2 | |
Gaku0606 | 0:d6cc210c71cc | 3 | EEPROM_24FC1025::EEPROM_24FC1025(I2C &i2cBus, int A0, int A1){ |
Gaku0606 | 0:d6cc210c71cc | 4 | _i2c = &i2cBus; |
Gaku0606 | 0:d6cc210c71cc | 5 | _i2c->frequency(400000);//400kHz |
Gaku0606 | 0:d6cc210c71cc | 6 | if(A0 == 0 && A1 == 0){ |
Gaku0606 | 0:d6cc210c71cc | 7 | uniqueAddr = 0b00000000; |
Gaku0606 | 0:d6cc210c71cc | 8 | } |
Gaku0606 | 0:d6cc210c71cc | 9 | else if(A0 == 1 && A1 == 0){ |
Gaku0606 | 0:d6cc210c71cc | 10 | uniqueAddr = 0b00000010; |
Gaku0606 | 0:d6cc210c71cc | 11 | } |
Gaku0606 | 0:d6cc210c71cc | 12 | else if(A0 == 0 && A1 == 1){ |
Gaku0606 | 0:d6cc210c71cc | 13 | uniqueAddr = 0b00000100; |
Gaku0606 | 0:d6cc210c71cc | 14 | } |
Gaku0606 | 0:d6cc210c71cc | 15 | else if(A0 == 1 && A1 == 1){ |
Gaku0606 | 0:d6cc210c71cc | 16 | uniqueAddr = 0b00000110; |
Gaku0606 | 0:d6cc210c71cc | 17 | } |
Gaku0606 | 0:d6cc210c71cc | 18 | //for 24FC1025 |
Gaku0606 | 0:d6cc210c71cc | 19 | size = 131072;//128 kbyte |
Gaku0606 | 0:d6cc210c71cc | 20 | } |
Gaku0606 | 0:d6cc210c71cc | 21 | |
Gaku0606 | 0:d6cc210c71cc | 22 | int EEPROM_24FC1025::checkAddr(uint32_t addr){ |
Gaku0606 | 0:d6cc210c71cc | 23 | if(addr > size) return 0; |
Gaku0606 | 0:d6cc210c71cc | 24 | else return 1; |
Gaku0606 | 0:d6cc210c71cc | 25 | } |
Gaku0606 | 0:d6cc210c71cc | 26 | |
Gaku0606 | 0:d6cc210c71cc | 27 | int EEPROM_24FC1025::read(uint32_t regAddr, uint8_t *data, int length){ |
Gaku0606 | 0:d6cc210c71cc | 28 | |
Gaku0606 | 0:d6cc210c71cc | 29 | int slaveAddr; |
Gaku0606 | 0:d6cc210c71cc | 30 | char cmd[2]; |
Gaku0606 | 0:d6cc210c71cc | 31 | int ack = 0; |
Gaku0606 | 0:d6cc210c71cc | 32 | |
Gaku0606 | 0:d6cc210c71cc | 33 | //check over address |
Gaku0606 | 0:d6cc210c71cc | 34 | if(checkAddr(regAddr) == 0) return -1; |
Gaku0606 | 0:d6cc210c71cc | 35 | |
Gaku0606 | 0:d6cc210c71cc | 36 | //set control byte |
Gaku0606 | 0:d6cc210c71cc | 37 | if(regAddr < 0x00010000){ |
Gaku0606 | 0:d6cc210c71cc | 38 | slaveAddr = (CONTROL_BYTE | SEGMENT0 | uniqueAddr) & 0xFE;//0b10100xx0 |
Gaku0606 | 0:d6cc210c71cc | 39 | } |
Gaku0606 | 0:d6cc210c71cc | 40 | else{ |
Gaku0606 | 0:d6cc210c71cc | 41 | slaveAddr = (CONTROL_BYTE | SEGMENT1 | uniqueAddr) & 0xFE;//0b10101xx0 |
Gaku0606 | 0:d6cc210c71cc | 42 | regAddr -= 0x00010000; |
Gaku0606 | 0:d6cc210c71cc | 43 | } |
Gaku0606 | 0:d6cc210c71cc | 44 | //set register address |
Gaku0606 | 0:d6cc210c71cc | 45 | cmd[0] = (char)(regAddr >> 8);//high byte |
Gaku0606 | 0:d6cc210c71cc | 46 | cmd[1] = (char)(regAddr);// & 0xFF);//low byte |
Gaku0606 | 0:d6cc210c71cc | 47 | |
Gaku0606 | 0:d6cc210c71cc | 48 | //send control byte and register address |
Gaku0606 | 0:d6cc210c71cc | 49 | ack = _i2c->write(slaveAddr, cmd, 2, true); |
Gaku0606 | 0:d6cc210c71cc | 50 | if(ack != 0) { |
Gaku0606 | 0:d6cc210c71cc | 51 | printf("write error\r\n"); |
Gaku0606 | 0:d6cc210c71cc | 52 | return; |
Gaku0606 | 0:d6cc210c71cc | 53 | } |
Gaku0606 | 0:d6cc210c71cc | 54 | //receive date |
Gaku0606 | 0:d6cc210c71cc | 55 | slaveAddr = slaveAddr | 0x01;//0b1010yxx1 |
Gaku0606 | 0:d6cc210c71cc | 56 | ack = _i2c->read(slaveAddr, (char*)&*data, length, false); |
Gaku0606 | 0:d6cc210c71cc | 57 | if(ack != 0) { |
Gaku0606 | 0:d6cc210c71cc | 58 | printf("read error\r\n"); |
Gaku0606 | 0:d6cc210c71cc | 59 | return; |
Gaku0606 | 0:d6cc210c71cc | 60 | } |
Gaku0606 | 0:d6cc210c71cc | 61 | return 0; |
Gaku0606 | 0:d6cc210c71cc | 62 | |
Gaku0606 | 0:d6cc210c71cc | 63 | } |
Gaku0606 | 0:d6cc210c71cc | 64 | |
Gaku0606 | 0:d6cc210c71cc | 65 | |
Gaku0606 | 0:d6cc210c71cc | 66 | int EEPROM_24FC1025::write(uint32_t regAddr, uint8_t data){ |
Gaku0606 | 0:d6cc210c71cc | 67 | char cmd[3] = {0}; |
Gaku0606 | 0:d6cc210c71cc | 68 | int slaveAddr = 0; |
Gaku0606 | 0:d6cc210c71cc | 69 | //check over address |
Gaku0606 | 0:d6cc210c71cc | 70 | if(checkAddr(regAddr) == 0) return -1; |
Gaku0606 | 0:d6cc210c71cc | 71 | |
Gaku0606 | 0:d6cc210c71cc | 72 | //set control byte |
Gaku0606 | 0:d6cc210c71cc | 73 | if(regAddr < 0x00010000){ |
Gaku0606 | 0:d6cc210c71cc | 74 | slaveAddr = (CONTROL_BYTE | SEGMENT0 | uniqueAddr) & 0xFE;//0b10100xx0 |
Gaku0606 | 0:d6cc210c71cc | 75 | } |
Gaku0606 | 0:d6cc210c71cc | 76 | else{ |
Gaku0606 | 0:d6cc210c71cc | 77 | slaveAddr = (CONTROL_BYTE | SEGMENT1 | uniqueAddr) & 0xFE;//0b10101xx0 |
Gaku0606 | 0:d6cc210c71cc | 78 | regAddr -= 0x00010000; |
Gaku0606 | 0:d6cc210c71cc | 79 | } |
Gaku0606 | 0:d6cc210c71cc | 80 | cmd[0] = (char)(regAddr >> 8); |
Gaku0606 | 0:d6cc210c71cc | 81 | cmd[1] = (char)(regAddr & 0xFF); |
Gaku0606 | 0:d6cc210c71cc | 82 | cmd[2] = (char)data; |
Gaku0606 | 0:d6cc210c71cc | 83 | |
Gaku0606 | 0:d6cc210c71cc | 84 | _i2c->write(slaveAddr, cmd, 3, false); |
Gaku0606 | 0:d6cc210c71cc | 85 | |
Gaku0606 | 0:d6cc210c71cc | 86 | return 0; |
Gaku0606 | 0:d6cc210c71cc | 87 | } |