Уменьшил частоту ЦП. Исправил останов двигателей.

This commit is contained in:
Beslan
2022-01-25 17:20:02 +03:00
parent 97fd10d8f8
commit 4775b62379
2 changed files with 83 additions and 90 deletions

View File

@@ -48,89 +48,97 @@ EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2
_type = type; _type = type;
// Check address range // Check address range
_address = address; _address = static_cast<int>(address);
switch (type) { switch (type) {
case T24C01 : case T24C01 :
case T24C02 : case T24C02 : {
if (address > 7) { if (address > 7U) {
_errnum = EEPROM_BadAddress; _errnum = EEPROM_BadAddress;
} }
_address = _address << 1; _address = _address << 1;
_page_write = 8U; _page_write = 8U;
_page_number = 1U; _page_number = 1U;
}
break; break;
case T24C04 : case T24C04 : {
if (address > 7) { if (address > 7U) {
_errnum = EEPROM_BadAddress; _errnum = EEPROM_BadAddress;
} }
_address = (_address & 0xFE) << 1; _address = (_address & 0xFE) << 1;
_page_write = 16U; _page_write = 16U;
_page_number = 2U; _page_number = 2U;
}
break; break;
case T24C08 : case T24C08 : {
if (address > 7) { if (address > 7U) {
_errnum = EEPROM_BadAddress; _errnum = EEPROM_BadAddress;
} }
_address = (_address & 0xFC) << 1; _address = (_address & 0xFC) << 1;
_page_write = 16U; _page_write = 16U;
_page_number = 4U; _page_number = 4U;
}
break; break;
case T24C16 : case T24C16 : {
_address = 0; _address = 0;
_page_write = 16U; _page_write = 16U;
_page_number = 8U; _page_number = 8U;
}
break; break;
case T24C32 : case T24C32 :
case T24C64 : case T24C64 : {
if (address > 7) { if (address > 7U) {
_errnum = EEPROM_BadAddress; _errnum = EEPROM_BadAddress;
} }
_address = _address << 1; _address = _address << 1;
_page_write = 32U; _page_write = 32U;
_page_number = 1U; _page_number = 1U;
}
break; break;
case T24C128 : case T24C128 :
case T24C256 : case T24C256 : {
if (address > 3) { if (address > 3U) {
_errnum = EEPROM_BadAddress; _errnum = EEPROM_BadAddress;
} }
_address = _address << 1; _address = _address << 1;
_page_write = 64U; _page_write = 64U;
_page_number = 1U; _page_number = 1U;
}
break; break;
case T24C512 : case T24C512 : {
if (address > 3) { if (address > 3U) {
_errnum = EEPROM_BadAddress; _errnum = EEPROM_BadAddress;
} }
_address = _address << 1; _address = _address << 1;
_page_write = 128U; _page_write = 128U;
_page_number = 1U; _page_number = 1U;
}
break; break;
case T24C1024 : case T24C1024 : {
if (address > 7) { if (address > 7U) {
_errnum = EEPROM_BadAddress; _errnum = EEPROM_BadAddress;
} }
_address = (_address & 0xFE) << 1; _address = (_address & 0xFE) << 1;
_page_write = 128U; _page_write = 128U;
_page_number = 2U; _page_number = 2U;
}
break; break;
case T24C1025 : case T24C1025 : {
if (address > 3) { if (address > 3U) {
_errnum = EEPROM_BadAddress; _errnum = EEPROM_BadAddress;
} }
_address = _address << 1; _address = _address << 1;
_page_write = 128U; _page_write = 128U;
_page_number = 2U; _page_number = 2U;
}
break; break;
} }
// Size in bytes // Size in bytes
_size = _type; _size = _type;
if (_type == T24C1025) if (_type == T24C1025) { _size = T24C1024; }
_size = T24C1024;
// Set I2C frequency // 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; int ack;
// Check error // Check error
if (_errnum) if (_errnum) { return; }
return;
// Check address // Check address
if (!checkAddress(address)) { if (!checkAddress(address)) {
@@ -161,8 +168,7 @@ void EEPROM::write(uint32_t address, int8_t data) {
// Compute page number // Compute page number
page = 0U; page = 0U;
if (_type < T24C32) if (_type < T24C32) { page = static_cast<uint8_t> (address / 256U); }
page = (uint8_t) (address / 256U);
// Device address // Device address
addr = EEPROM_Address | _address | (page << 1); addr = EEPROM_Address | _address | (page << 1);
@@ -171,24 +177,24 @@ void EEPROM::write(uint32_t address, int8_t data) {
len = 2; len = 2;
// Word address // Word address
cmd[0] = (uint8_t) (address - page * 256U); cmd[0] = static_cast<uint8_t> (address - page * 256U);
// Data // Data
cmd[1] = (uint8_t) data; cmd[1] = static_cast<uint8_t> (data);
} else { } else {
len = 3; len = 3;
// First word address (MSB) // First word address (MSB)
cmd[0] = (uint8_t) (address >> 8); cmd[0] = static_cast<uint8_t> (address >> 8);
// Second word address (LSB) // Second word address (LSB)
cmd[1] = (uint8_t) address; cmd[1] = static_cast<uint8_t> (address);
// Data // 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) { if (ack != 0) {
_errnum = EEPROM_I2cError; _errnum = EEPROM_I2cError;
return; 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) { void EEPROM::write(uint32_t address, const int8_t data[], uint32_t length) {
uint8_t page; uint8_t page;
uint8_t addr = 0; uint8_t addr = 0U;
uint8_t blocs, remain; uint8_t blocs;
uint8_t fpart, lpart; uint8_t remain;
uint8_t i, j, ind; uint8_t fpart;
uint8_t lpart;
uint8_t i;
uint8_t j;
uint8_t ind;
uint8_t cmd[129]; uint8_t cmd[129];
int ack; int ack;
// Check error // Check error
if (_errnum) if (_errnum) { return; }
return;
// Check address // Check address
if (!checkAddress(address)) { if (!checkAddress(address)) {
@@ -243,14 +252,14 @@ void EEPROM::write(uint32_t address, const int8_t data[], uint32_t length) {
// Compute page number // Compute page number
page = 0U; page = 0U;
if (_type < T24C32) if (_type < T24C32)
page = (uint8_t) (address / 256U); page = static_cast<uint8_t> (address / 256U);
// Device address // Device address
addr = EEPROM_Address | _address | (page << 1); addr = EEPROM_Address | _address | (page << 1);
if (_type < T24C32) { if (_type < T24C32) {
// Word address // 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 if ((uint8_t) ((address + _page_write) / 256U) == page) { // Data fit in the same page
// Add data // Add data
@@ -475,7 +484,7 @@ void EEPROM::write(uint32_t address, int16_t data) {
return; return;
} }
memcpy(cmd, &data, 2); (void) memcpy(cmd, &data, 2U);
write(address, cmd, 2U); write(address, cmd, 2U);
@@ -502,7 +511,7 @@ void EEPROM::write(uint32_t address, int32_t data) {
return; return;
} }
memcpy(cmd, &data, 4U); (void) memcpy(cmd, &data, 4U);
write(address, cmd, 4U); write(address, cmd, 4U);
@@ -529,7 +538,7 @@ void EEPROM::write(uint32_t address, float data) {
return; return;
} }
memcpy(cmd, &data, 4); (void) memcpy(cmd, &data, 4);
write(address, cmd, 4U); write(address, cmd, 4U);
@@ -563,7 +572,7 @@ void EEPROM::write(uint32_t address, void *data, uint32_t size) {
return; return;
} }
memcpy(cmd, (uint8_t *) data, size); (void) memcpy(cmd, (uint8_t *) data, size);
write(address, cmd, size); write(address, cmd, size);
@@ -598,8 +607,7 @@ void EEPROM::read(uint32_t address, int8_t &data) {
// Compute page number // Compute page number
page = 0U; page = 0U;
if (_type < T24C32) if (_type < T24C32) { page = static_cast<uint8_t> (address / 256U); }
page = static_cast<uint8_t> (address / 256U);
// Device address // Device address
addr = EEPROM_Address | _address | (page << 1); 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 // Compute page number
page = 0U; page = 0U;
if (_type < T24C32) if (_type < T24C32) { page = static_cast<uint8_t> (address / 256U); }
page = static_cast<uint8_t> (address / 256U);
// Device address // Device address
addr = EEPROM_Address | _address | (page << 1U); addr = EEPROM_Address | _address | (page << 1U);
@@ -756,7 +763,7 @@ void EEPROM::read(uint32_t address, int16_t &data) {
read(address, cmd, 2U); 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]; int8_t cmd[4];
// Check error // Check error
if (_errnum) if (_errnum) { return; }
return;
// Check address // Check address
if (!checkAddress(address + 3U)) { if (!checkAddress(address + 3U)) {
@@ -783,7 +789,7 @@ void EEPROM::read(uint32_t address, int32_t &data) {
read(address, cmd, 4U); 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]; int8_t cmd[4];
// Check error // Check error
if (_errnum) if (_errnum) { return; }
return;
// Check address // Check address
if (!checkAddress(address + 3U)) { if (!checkAddress(address + 3U)) {
@@ -810,7 +815,7 @@ void EEPROM::read(uint32_t address, float &data) {
read(address, cmd, 4U); 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) { switch (_type) {
case T24C01 : case T24C01 :
if (address >= T24C01) if (address >= T24C01) { ret = false; }
ret = false;
break; break;
case T24C02 : case T24C02 :
if (address >= T24C02) if (address >= T24C02) { ret = false; }
ret = false;
break; break;
case T24C04 : case T24C04 :
if (address >= T24C04) if (address >= T24C04) { ret = false; }
ret = false;
break; break;
case T24C08 : case T24C08 :
if (address >= T24C08) if (address >= T24C08) { ret = false; }
ret = false;
break; break;
case T24C16 : case T24C16 :
if (address >= T24C16) if (address >= T24C16) { ret = false; }
ret = false;
break; break;
case T24C32 : case T24C32 :
if (address >= T24C32) if (address >= T24C32) { ret = false; }
ret = false;
break; break;
case T24C64 : case T24C64 :
if (address >= T24C64) if (address >= T24C64) { ret = false; }
ret = false;
break; break;
case T24C128 : case T24C128 :
if (address >= T24C128) if (address >= T24C128) { ret = false; }
ret = false;
break; break;
case T24C256 : case T24C256 :
if (address >= T24C256) if (address >= T24C256) { ret = false; }
ret = false;
break; break;
case T24C512 : case T24C512 :
if (address >= T24C512) if (address >= T24C512) { ret = false; }
ret = false;
break; break;
case T24C1024 : case T24C1024 :
if (address >= T24C1024) if (address >= T24C1024) { ret = false; }
ret = false;
break; break;
case T24C1025 : case T24C1025 :
if (address >= T24C1025 - 1) if (address >= T24C1025 - 1) { ret = false; }
ret = false;
break; break;
} }

View File

@@ -8,16 +8,16 @@
#include "mbed.h" #include "mbed.h"
// Defines // Defines
#define EEPROM_Address 0xa0 #define EEPROM_Address 0xa0U
#define EEPROM_NoError 0x00 #define EEPROM_NoError 0x00U
#define EEPROM_BadAddress 0x01 #define EEPROM_BadAddress 0x01U
#define EEPROM_I2cError 0x02 #define EEPROM_I2cError 0x02U
#define EEPROM_ParamError 0x03 #define EEPROM_ParamError 0x03U
#define EEPROM_OutOfRange 0x04 #define EEPROM_OutOfRange 0x04U
#define EEPROM_MallocError 0x05 #define EEPROM_MallocError 0x05U
#define EEPROM_MaxError 6 #define EEPROM_MaxError 6U
static std::string _ErrorMessageEEPROM[EEPROM_MaxError] = { static std::string _ErrorMessageEEPROM[EEPROM_MaxError] = {
"", "",
@@ -33,9 +33,9 @@ static std::string _ErrorMessageEEPROM[EEPROM_MaxError] = {
class EEPROM { class EEPROM {
public: public:
enum TypeEeprom { enum TypeEeprom {
T24C01 = 128, T24C02 = 256, T24C04 = 512, T24C08 = 1024, T24C16 = 2048, T24C01 = 128U, T24C02 = 256U, T24C04 = 512U, T24C08 = 1024U, T24C16 = 2048U,
T24C32 = 4096, T24C64 = 8192, T24C128 = 16384, T24C256 = 32768, T24C32 = 4096U, T24C64 = 8192U, T24C128 = 16384U, T24C256 = 32768U,
T24C512 = 65536, T24C1024 = 131072, T24C1025 = 131073 T24C512 = 65536U, T24C1024 = 131072U, T24C1025 = 131073U
} Type; } Type;
/** /**
@@ -195,7 +195,7 @@ public:
* @param none * @param none
* @return current error message(std::string) * @return current error message(std::string)
*/ */
std::string getErrorMessage(void) const { std::string getErrorMessage() const {
return (_ErrorMessageEEPROM[_errnum]); return (_ErrorMessageEEPROM[_errnum]);
} }