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

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;
// 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;
}