Уменьшил частоту ЦП. Исправил останов двигателей.
This commit is contained in:
149
eeprom.cpp
149
eeprom.cpp
@@ -48,89 +48,97 @@ EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2
|
||||
_type = type;
|
||||
|
||||
// Check address range
|
||||
_address = address;
|
||||
_address = static_cast<int>(address);
|
||||
switch (type) {
|
||||
case T24C01 :
|
||||
case T24C02 :
|
||||
if (address > 7) {
|
||||
case T24C02 : {
|
||||
if (address > 7U) {
|
||||
_errnum = EEPROM_BadAddress;
|
||||
}
|
||||
_address = _address << 1;
|
||||
_page_write = 8U;
|
||||
_page_number = 1U;
|
||||
}
|
||||
break;
|
||||
case T24C04 :
|
||||
if (address > 7) {
|
||||
case T24C04 : {
|
||||
if (address > 7U) {
|
||||
_errnum = EEPROM_BadAddress;
|
||||
}
|
||||
_address = (_address & 0xFE) << 1;
|
||||
_page_write = 16U;
|
||||
_page_number = 2U;
|
||||
}
|
||||
break;
|
||||
case T24C08 :
|
||||
if (address > 7) {
|
||||
case T24C08 : {
|
||||
if (address > 7U) {
|
||||
_errnum = EEPROM_BadAddress;
|
||||
}
|
||||
_address = (_address & 0xFC) << 1;
|
||||
_page_write = 16U;
|
||||
_page_number = 4U;
|
||||
}
|
||||
break;
|
||||
case T24C16 :
|
||||
case T24C16 : {
|
||||
_address = 0;
|
||||
_page_write = 16U;
|
||||
_page_number = 8U;
|
||||
}
|
||||
break;
|
||||
case T24C32 :
|
||||
case T24C64 :
|
||||
if (address > 7) {
|
||||
case T24C64 : {
|
||||
if (address > 7U) {
|
||||
_errnum = EEPROM_BadAddress;
|
||||
}
|
||||
_address = _address << 1;
|
||||
_page_write = 32U;
|
||||
_page_number = 1U;
|
||||
}
|
||||
break;
|
||||
case T24C128 :
|
||||
case T24C256 :
|
||||
if (address > 3) {
|
||||
case T24C256 : {
|
||||
if (address > 3U) {
|
||||
_errnum = EEPROM_BadAddress;
|
||||
}
|
||||
_address = _address << 1;
|
||||
_page_write = 64U;
|
||||
_page_number = 1U;
|
||||
}
|
||||
break;
|
||||
case T24C512 :
|
||||
if (address > 3) {
|
||||
case T24C512 : {
|
||||
if (address > 3U) {
|
||||
_errnum = EEPROM_BadAddress;
|
||||
}
|
||||
_address = _address << 1;
|
||||
_page_write = 128U;
|
||||
_page_number = 1U;
|
||||
}
|
||||
break;
|
||||
case T24C1024 :
|
||||
if (address > 7) {
|
||||
case T24C1024 : {
|
||||
if (address > 7U) {
|
||||
_errnum = EEPROM_BadAddress;
|
||||
}
|
||||
_address = (_address & 0xFE) << 1;
|
||||
_page_write = 128U;
|
||||
_page_number = 2U;
|
||||
}
|
||||
break;
|
||||
case T24C1025 :
|
||||
if (address > 3) {
|
||||
case T24C1025 : {
|
||||
if (address > 3U) {
|
||||
_errnum = EEPROM_BadAddress;
|
||||
}
|
||||
_address = _address << 1;
|
||||
_page_write = 128U;
|
||||
_page_number = 2U;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Size in bytes
|
||||
_size = _type;
|
||||
if (_type == T24C1025)
|
||||
_size = T24C1024;
|
||||
if (_type == T24C1025) { _size = T24C1024; }
|
||||
|
||||
// Set I2C frequency
|
||||
_i2c.frequency(400000);
|
||||
_i2c.frequency(400'000);
|
||||
|
||||
}
|
||||
|
||||
@@ -150,8 +158,7 @@ void EEPROM::write(uint32_t address, int8_t data) {
|
||||
int ack;
|
||||
|
||||
// Check error
|
||||
if (_errnum)
|
||||
return;
|
||||
if (_errnum) { return; }
|
||||
|
||||
// Check address
|
||||
if (!checkAddress(address)) {
|
||||
@@ -161,8 +168,7 @@ void EEPROM::write(uint32_t address, int8_t data) {
|
||||
|
||||
// Compute page number
|
||||
page = 0U;
|
||||
if (_type < T24C32)
|
||||
page = (uint8_t) (address / 256U);
|
||||
if (_type < T24C32) { page = static_cast<uint8_t> (address / 256U); }
|
||||
|
||||
// Device address
|
||||
addr = EEPROM_Address | _address | (page << 1);
|
||||
@@ -171,24 +177,24 @@ void EEPROM::write(uint32_t address, int8_t data) {
|
||||
len = 2;
|
||||
|
||||
// Word address
|
||||
cmd[0] = (uint8_t) (address - page * 256U);
|
||||
cmd[0] = static_cast<uint8_t> (address - page * 256U);
|
||||
|
||||
// Data
|
||||
cmd[1] = (uint8_t) data;
|
||||
cmd[1] = static_cast<uint8_t> (data);
|
||||
} else {
|
||||
len = 3;
|
||||
|
||||
// First word address (MSB)
|
||||
cmd[0] = (uint8_t) (address >> 8);
|
||||
cmd[0] = static_cast<uint8_t> (address >> 8);
|
||||
|
||||
// Second word address (LSB)
|
||||
cmd[1] = (uint8_t) address;
|
||||
cmd[1] = static_cast<uint8_t> (address);
|
||||
|
||||
// Data
|
||||
cmd[2] = (uint8_t) data;
|
||||
cmd[2] = static_cast<uint8_t> (data);
|
||||
}
|
||||
|
||||
ack = _i2c.write((int) addr, (char *) cmd, len);
|
||||
ack = _i2c.write(static_cast<int> (addr), reinterpret_cast<char *> (cmd), len);
|
||||
if (ack != 0) {
|
||||
_errnum = EEPROM_I2cError;
|
||||
return;
|
||||
@@ -210,16 +216,19 @@ void EEPROM::write(uint32_t address, int8_t data) {
|
||||
*/
|
||||
void EEPROM::write(uint32_t address, const int8_t data[], uint32_t length) {
|
||||
uint8_t page;
|
||||
uint8_t addr = 0;
|
||||
uint8_t blocs, remain;
|
||||
uint8_t fpart, lpart;
|
||||
uint8_t i, j, ind;
|
||||
uint8_t addr = 0U;
|
||||
uint8_t blocs;
|
||||
uint8_t remain;
|
||||
uint8_t fpart;
|
||||
uint8_t lpart;
|
||||
uint8_t i;
|
||||
uint8_t j;
|
||||
uint8_t ind;
|
||||
uint8_t cmd[129];
|
||||
int ack;
|
||||
|
||||
// Check error
|
||||
if (_errnum)
|
||||
return;
|
||||
if (_errnum) { return; }
|
||||
|
||||
// Check address
|
||||
if (!checkAddress(address)) {
|
||||
@@ -243,14 +252,14 @@ void EEPROM::write(uint32_t address, const int8_t data[], uint32_t length) {
|
||||
// Compute page number
|
||||
page = 0U;
|
||||
if (_type < T24C32)
|
||||
page = (uint8_t) (address / 256U);
|
||||
page = static_cast<uint8_t> (address / 256U);
|
||||
|
||||
// Device address
|
||||
addr = EEPROM_Address | _address | (page << 1);
|
||||
|
||||
if (_type < T24C32) {
|
||||
// Word address
|
||||
cmd[0] = (uint8_t) (address - page * 256U);
|
||||
cmd[0] = static_cast<uint8_t> (address - page * 256U);
|
||||
|
||||
if ((uint8_t) ((address + _page_write) / 256U) == page) { // Data fit in the same page
|
||||
// Add data
|
||||
@@ -475,7 +484,7 @@ void EEPROM::write(uint32_t address, int16_t data) {
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(cmd, &data, 2);
|
||||
(void) memcpy(cmd, &data, 2U);
|
||||
|
||||
write(address, cmd, 2U);
|
||||
|
||||
@@ -502,7 +511,7 @@ void EEPROM::write(uint32_t address, int32_t data) {
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(cmd, &data, 4U);
|
||||
(void) memcpy(cmd, &data, 4U);
|
||||
|
||||
write(address, cmd, 4U);
|
||||
|
||||
@@ -529,7 +538,7 @@ void EEPROM::write(uint32_t address, float data) {
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(cmd, &data, 4);
|
||||
(void) memcpy(cmd, &data, 4);
|
||||
|
||||
write(address, cmd, 4U);
|
||||
|
||||
@@ -563,7 +572,7 @@ void EEPROM::write(uint32_t address, void *data, uint32_t size) {
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(cmd, (uint8_t *) data, size);
|
||||
(void) memcpy(cmd, (uint8_t *) data, size);
|
||||
|
||||
write(address, cmd, size);
|
||||
|
||||
@@ -598,8 +607,7 @@ void EEPROM::read(uint32_t address, int8_t &data) {
|
||||
|
||||
// Compute page number
|
||||
page = 0U;
|
||||
if (_type < T24C32)
|
||||
page = static_cast<uint8_t> (address / 256U);
|
||||
if (_type < T24C32) { page = static_cast<uint8_t> (address / 256U); }
|
||||
|
||||
// Device address
|
||||
addr = EEPROM_Address | _address | (page << 1);
|
||||
@@ -669,8 +677,7 @@ void EEPROM::read(uint32_t address, int8_t *data, uint32_t size) {
|
||||
|
||||
// Compute page number
|
||||
page = 0U;
|
||||
if (_type < T24C32)
|
||||
page = static_cast<uint8_t> (address / 256U);
|
||||
if (_type < T24C32) { page = static_cast<uint8_t> (address / 256U); }
|
||||
|
||||
// Device address
|
||||
addr = EEPROM_Address | _address | (page << 1U);
|
||||
@@ -756,7 +763,7 @@ void EEPROM::read(uint32_t address, int16_t &data) {
|
||||
|
||||
read(address, cmd, 2U);
|
||||
|
||||
memcpy(&data, cmd, 2);
|
||||
(void) memcpy(&data, cmd, 2);
|
||||
|
||||
}
|
||||
|
||||
@@ -772,8 +779,7 @@ void EEPROM::read(uint32_t address, int32_t &data) {
|
||||
int8_t cmd[4];
|
||||
|
||||
// Check error
|
||||
if (_errnum)
|
||||
return;
|
||||
if (_errnum) { return; }
|
||||
|
||||
// Check address
|
||||
if (!checkAddress(address + 3U)) {
|
||||
@@ -783,7 +789,7 @@ void EEPROM::read(uint32_t address, int32_t &data) {
|
||||
|
||||
read(address, cmd, 4U);
|
||||
|
||||
memcpy(&data, cmd, 4);
|
||||
(void) memcpy(&data, cmd, 4U);
|
||||
|
||||
}
|
||||
|
||||
@@ -799,8 +805,7 @@ void EEPROM::read(uint32_t address, float &data) {
|
||||
int8_t cmd[4];
|
||||
|
||||
// Check error
|
||||
if (_errnum)
|
||||
return;
|
||||
if (_errnum) { return; }
|
||||
|
||||
// Check address
|
||||
if (!checkAddress(address + 3U)) {
|
||||
@@ -810,7 +815,7 @@ void EEPROM::read(uint32_t address, float &data) {
|
||||
|
||||
read(address, cmd, 4U);
|
||||
|
||||
memcpy(&data, cmd, 4);
|
||||
(void) memcpy(&data, cmd, 4U);
|
||||
|
||||
}
|
||||
|
||||
@@ -982,52 +987,40 @@ bool EEPROM::checkAddress(uint32_t address) {
|
||||
|
||||
switch (_type) {
|
||||
case T24C01 :
|
||||
if (address >= T24C01)
|
||||
ret = false;
|
||||
if (address >= T24C01) { ret = false; }
|
||||
break;
|
||||
case T24C02 :
|
||||
if (address >= T24C02)
|
||||
ret = false;
|
||||
if (address >= T24C02) { ret = false; }
|
||||
break;
|
||||
case T24C04 :
|
||||
if (address >= T24C04)
|
||||
ret = false;
|
||||
if (address >= T24C04) { ret = false; }
|
||||
break;
|
||||
case T24C08 :
|
||||
if (address >= T24C08)
|
||||
ret = false;
|
||||
if (address >= T24C08) { ret = false; }
|
||||
break;
|
||||
case T24C16 :
|
||||
if (address >= T24C16)
|
||||
ret = false;
|
||||
if (address >= T24C16) { ret = false; }
|
||||
break;
|
||||
case T24C32 :
|
||||
if (address >= T24C32)
|
||||
ret = false;
|
||||
if (address >= T24C32) { ret = false; }
|
||||
break;
|
||||
case T24C64 :
|
||||
if (address >= T24C64)
|
||||
ret = false;
|
||||
if (address >= T24C64) { ret = false; }
|
||||
break;
|
||||
case T24C128 :
|
||||
if (address >= T24C128)
|
||||
ret = false;
|
||||
if (address >= T24C128) { ret = false; }
|
||||
break;
|
||||
case T24C256 :
|
||||
if (address >= T24C256)
|
||||
ret = false;
|
||||
if (address >= T24C256) { ret = false; }
|
||||
break;
|
||||
case T24C512 :
|
||||
if (address >= T24C512)
|
||||
ret = false;
|
||||
if (address >= T24C512) { ret = false; }
|
||||
break;
|
||||
case T24C1024 :
|
||||
if (address >= T24C1024)
|
||||
ret = false;
|
||||
if (address >= T24C1024) { ret = false; }
|
||||
break;
|
||||
case T24C1025 :
|
||||
if (address >= T24C1025 - 1)
|
||||
ret = false;
|
||||
if (address >= T24C1025 - 1) { ret = false; }
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
24
eeprom.h
24
eeprom.h
@@ -8,16 +8,16 @@
|
||||
#include "mbed.h"
|
||||
|
||||
// Defines
|
||||
#define EEPROM_Address 0xa0
|
||||
#define EEPROM_Address 0xa0U
|
||||
|
||||
#define EEPROM_NoError 0x00
|
||||
#define EEPROM_BadAddress 0x01
|
||||
#define EEPROM_I2cError 0x02
|
||||
#define EEPROM_ParamError 0x03
|
||||
#define EEPROM_OutOfRange 0x04
|
||||
#define EEPROM_MallocError 0x05
|
||||
#define EEPROM_NoError 0x00U
|
||||
#define EEPROM_BadAddress 0x01U
|
||||
#define EEPROM_I2cError 0x02U
|
||||
#define EEPROM_ParamError 0x03U
|
||||
#define EEPROM_OutOfRange 0x04U
|
||||
#define EEPROM_MallocError 0x05U
|
||||
|
||||
#define EEPROM_MaxError 6
|
||||
#define EEPROM_MaxError 6U
|
||||
|
||||
static std::string _ErrorMessageEEPROM[EEPROM_MaxError] = {
|
||||
"",
|
||||
@@ -33,9 +33,9 @@ static std::string _ErrorMessageEEPROM[EEPROM_MaxError] = {
|
||||
class EEPROM {
|
||||
public:
|
||||
enum TypeEeprom {
|
||||
T24C01 = 128, T24C02 = 256, T24C04 = 512, T24C08 = 1024, T24C16 = 2048,
|
||||
T24C32 = 4096, T24C64 = 8192, T24C128 = 16384, T24C256 = 32768,
|
||||
T24C512 = 65536, T24C1024 = 131072, T24C1025 = 131073
|
||||
T24C01 = 128U, T24C02 = 256U, T24C04 = 512U, T24C08 = 1024U, T24C16 = 2048U,
|
||||
T24C32 = 4096U, T24C64 = 8192U, T24C128 = 16384U, T24C256 = 32768U,
|
||||
T24C512 = 65536U, T24C1024 = 131072U, T24C1025 = 131073U
|
||||
} Type;
|
||||
|
||||
/**
|
||||
@@ -195,7 +195,7 @@ public:
|
||||
* @param none
|
||||
* @return current error message(std::string)
|
||||
*/
|
||||
std::string getErrorMessage(void) const {
|
||||
std::string getErrorMessage() const {
|
||||
return (_ErrorMessageEEPROM[_errnum]);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user