Выскакивает ошибка exit status1 no matching functional forcall to"USI_TWI: :registFrom(int, unit8_t&, int) ’
Народ, у кого доступ третьего уровня - поправьте этот бредовый заголовок.
поправил.
1 лайк
@Yri
Добро пожаловать на форум.
Пожалуйста, ознакомтесь с этой темой:
Особенно обратите внимание на последний абзац первого сообщения - “Типичные ошибки новичков при публикации кода”
#include <DigisparkOLED.h>
#include <Wire.h>
#define deviceAddress 11
// Standard and common non-standard Smart Battery commands
#define MANUFACTURER_ACCESS 0x00
#define REM_CAP_ALARM 0x01
#define REM_TIME_ALARM 0x02
#define BATTERY_MODE 0x03
#define TEMPERATURE 0x08
#define VOLTAGE 0x09
#define CURRENT 0x0A
#define RELATIVE_SOC 0x0D
#define ABSOLUTE_SOC 0x0E
#define REMAINING_CAPACITY 0x0F
#define FULL_CHARGE_CAPACITY 0x10
#define TIME_TO_FULL 0x13
#define CHARGING_CURRENT 0x14
#define CHARGING_VOLTAGE 0x15
#define BATTERY_STATUS 0x16
#define CYCLE_COUNT 0x17
#define DESIGN_CAPACITY 0x18
#define DESIGN_VOLTAGE 0x19
#define SPEC_INFO 0x1A
#define MFG_DATE 0x1B
#define SERIAL_NUM 0x1C
#define MFG_NAME 0x20 // String
#define DEV_NAME 0x21 // String
#define CELL_CHEM 0x22 // String
#define MFG_DATA 0x23 // String
#define CELL4_VOLTAGE 0x3C
#define CELL3_VOLTAGE 0x3D
#define CELL2_VOLTAGE 0x3E
#define CELL1_VOLTAGE 0x3F
#define STATE_OF_HEALTH 0x4F
#define PF_STATUS 0x53
#define DJI_SERIAL 0xD8 // String
#define bufferLen 32
uint8_t i2cBuffer[bufferLen];
uint8_t read_byte()
{
while (1)
{
if (Wire.available())
{
return Wire.read();
}
}
}
int fetchWord(byte func)
{
Wire.beginTransmission(deviceAddress);
Wire.write(func);
Wire.endTransmission(true);
delay(1); // FIX wire bug
Wire.requestFrom(deviceAddress, 2);
uint8_t b1 = read_byte();
uint8_t b2 = read_byte();
Wire.endTransmission(true);
return (int)b1 | (((int)b2) << 8);
}
uint8_t i2c_smbus_read_block(uint8_t command, uint8_t* blockBuffer, uint8_t blockBufferLen)
{
uint8_t x, num_bytes;
Wire.beginTransmission(deviceAddress);
Wire.write(command);
Wire.endTransmission(false);
delay(1);
Wire.requestFrom(deviceAddress, blockBufferLen, true);
num_bytes = read_byte();
num_bytes = constrain(num_bytes, 0, blockBufferLen - 2);
for (x = 0; x < num_bytes - 1; x++)
{ // -1 because x=num_bytes-1 if x<y; last byte needs to be "nack"'d, x<y-1
blockBuffer[x] = read_byte();
}
blockBuffer[x++] = read_byte(); // this will nack the last byte and store it in x's num_bytes-1 address.
blockBuffer[x] = 0; // and null it at last_byte+1
Wire.endTransmission();
return num_bytes;
}
void check_sealed(byte clearscreen)
{
uint16_t uMac = fetchWord(MANUFACTURER_ACCESS);
if (clearscreen == 1)
{
oled.clear(); //all black
oled.setCursor(0, 0); //top left
}
oled.print(F("Manufacturer Access: 0x"));
oled.print(uMac, HEX);
switch(uMac & 0x0300)
{
case 0x0300:
oled.println(F(" SEALED"));
break;
case 0x0200:
oled.println(F(" UNSEALED"));
break;
case 0x0100:
oled.println(F(" FULL ACCESS"));
break;
default:
oled.println(F(" UNKNOWN"));
break;
}
return;
}
void mba_writecmd(byte b1, byte b2, byte end_trans)
{
Wire.beginTransmission(deviceAddress);
Wire.write(0x44); // ManufacturerBlockAccess()
Wire.write(0x02); // len
Wire.write(b1);
Wire.write(b2);
if (end_trans == 1)
Wire.endTransmission(true);
}
void do_unseal_dji() // Unseal using DJI key CCDF7EE0
{
oled.println(F("Unseal..."));
mba_writecmd(0xE0, 0x7E, 1);
mba_writecmd(0xDF, 0xCC, 1);
}
void do_fas_dji() // FAS using DJI key E0BCBF17
{
oled.println(F("Full access..."));
mba_writecmd(0x17, 0xBF, 1);
mba_writecmd(0xBC, 0xE0, 1);
}
void clear_pf_reset()
{
oled.println(F("Clear PF..."));
mba_writecmd(0x29, 0x00, 0);
Wire.write(0x7F); // FEC
Wire.endTransmission(true);
delay(100);
Wire.beginTransmission(deviceAddress);
Wire.write(0x44); // ManufacturerBlockAccess()
Wire.write(0x06); // len
Wire.write(0x62); // LifetimeDataBlock3 ???????
Wire.write(0x40);
Wire.write(0x01);
Wire.write(0x23);
Wire.write(0x45);
Wire.write(0x67);
Wire.write(0xDF); // FEC
Wire.endTransmission(true);
delay(100);
oled.println(F("Reset..."));
mba_writecmd(0x41, 0x00, 0);
Wire.write(0x22); // FEC
Wire.endTransmission(true);
delay(100);
oled.println(F("Done"));
}
void bat_2seal()
{
// seal DJI battery
mba_writecmd(0x30, 0x00, 1);
}
/*
byte bat_is_blocked()
{
uint8_t length_read = 0;
// Ввести ключи, достаточно пару unseal, затем послать 0x44, 0x02, 0x62, 0x40 и прочитать из 0x44 7 байт.
// Для незаблокированной батареи они будут 0x22 0x62 0x40 0x01 0x23 0x45 0x67.
bat_write2bytes(0x62, 0x40, 1);
length_read = i2c_smbus_read_block(0x44, i2cBuffer, 7);
if (length_read != 7)
{
return 1;
}
if ((i2cBuffer[0] == 0x22) and
(i2cBuffer[1] == 0x62) and
(i2cBuffer[2] == 0x40) and
(i2cBuffer[3] == 0x01) and
(i2cBuffer[4] == 0x23) and
(i2cBuffer[5] == 0x45) and
(i2cBuffer[6] == 0x67))
{
return 0;
}
return 1;
}
*/
void setup()
{
Wire.begin();
oled.begin();
}
void loop()
{
char *outstr = i2cBuffer;
oled.clear(); //all black
oled.setCursor(0, 3);
oled.setFont(FONT6X8);
oled.println(F("Connect to battery.."));
// Unlock battery if it is locked
uint16_t bat_status = fetchWord(BATTERY_STATUS);
uint16_t opstat = fetchWord(MANUFACTURER_ACCESS) & 0xFCFF;
i2c_smbus_read_block(PF_STATUS, i2cBuffer, 4);
if ((bat_status & 0x4800) or
(i2cBuffer[0] != 0) or
(i2cBuffer[1] != 0) or
(i2cBuffer[2] != 0) or
(i2cBuffer[3] != 0) or
(opstat != 0))
{
oled.clear(); //all black
oled.setCursor(0, 0); //top left
check_sealed(1); // Sealing status to OLED screen
delay(100);
do_unseal_dji(); // Unseal using DJI key
delay(100);
check_sealed(0);
delay(100);
do_fas_dji(); // Full access using DJI key
delay(2000);
oled.clear(); //all black
oled.setCursor(0, 0);
check_sealed(0);
mba_writecmd(0x2A, 0x00, 0); // Black Box Recorder Reset
Wire.write(0x40); // FEC
Wire.endTransmission(true);
mba_writecmd(0x28, 0x00, 0); // Lifetime Data Reset
Wire.write(0x6A); // FEC
Wire.endTransmission(true);
// unlock battery
clear_pf_reset(); // Clear PF and reset chip
delay(1000);
check_sealed(0);
delay(5000);
}
repeat_info:
i2c_smbus_read_block(DJI_SERIAL, i2cBuffer, bufferLen);
oled.clear(); //all black
oled.setCursor(0, 0); //top left
oled.print(F("Ser #:"));
oled.println(outstr);
oled.print(F("Cycle Count:"));
uint8_t cycles = fetchWord(CYCLE_COUNT);
oled.println(cycles);
oled.print(F("Full Ch Capacity:"));
oled.println(fetchWord(FULL_CHARGE_CAPACITY));
oled.print(F("Remaining Cap.:" ));
oled.println(fetchWord(REMAINING_CAPACITY));
oled.print(F("Relative Charge:"));
uint8_t charge = fetchWord(RELATIVE_SOC);
oled.print(charge);
oled.println(F("%"));
oled.print(F("Absolute Charge:"));
oled.print(fetchWord(ABSOLUTE_SOC));
oled.println(F("%"));
oled.print(F("Voltage:"));
int cell1 = fetchWord(CELL1_VOLTAGE);
int cell2 = fetchWord(CELL2_VOLTAGE);
oled.print(cell1);
oled.print(F("/"));
oled.println(cell2);
oled.print(F("Temp:"));
int temp = fetchWord(TEMPERATURE) * 10 - 27315;
oled.print(temp / 100);
oled.print(F("."));
oled.println(temp % 100);
delay(7000);
oled.clear(); //all black
oled.setCursor(0, 0); //top left
oled.print(F("Manufacturer:"));
i2c_smbus_read_block(MFG_NAME, i2cBuffer, bufferLen);
oled.println(outstr);
oled.print(F("Dev Name:"));
i2c_smbus_read_block(DEV_NAME, i2cBuffer, bufferLen);
oled.println(outstr);
oled.print(F("Chemistry:"));
i2c_smbus_read_block(CELL_CHEM, i2cBuffer, bufferLen);
oled.println(outstr);
oled.print(F("Data:"));
int mdate = fetchWord(MFG_DATE);
int mday = B00011111 & mdate;
int mmonth = mdate >> 5 & B00001111;
int myear = 1980 + (mdate >> 9 & B01111111);
oled.print(mday);
oled.print(F("."));
oled.print(mmonth);
oled.print(F("."));
oled.println(myear);
oled.print(F("Design Capacity:"));
oled.println(fetchWord(DESIGN_CAPACITY));
oled.print(F("Design Voltage:"));
oled.println(fetchWord(DESIGN_VOLTAGE));
oled.print(F("Specific. Info:"));
oled.println(fetchWord(SPEC_INFO));
oled.print(F("State of Health:"));
oled.println(fetchWord(STATE_OF_HEALTH));
delay(7000);
oled.clear(); //all black
oled.setCursor(0, 0); //top left
oled.println(F("Battery Mode:"));
oled.print(F("0b"));
oled.println(fetchWord(BATTERY_MODE), BIN);
oled.print(F("Status:0b"));
oled.println(fetchWord(BATTERY_STATUS), BIN);
oled.print(F("Current:"));
oled.print(fetchWord(CURRENT));
oled.println(F("mA"));
delay(7000);
goto repeat_info;
}