Ви не увійшли.
Сторінки 1
Сейчас столкнулся с одной своей ошибкой которую отладить не так то просто было. Почему компилятор не проверяет на наличие ошибок, если присвоить значение индексу массива, который не в его диапазона?
char model[8];//8 - размер массива в байтах
bool test = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
model[8] = 'n';//ошибка, индекс массива начинается с нуля и заканчиваться должен на 7
Serial.print(F("test = "));
Serial.println(test);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.print(F("test = "));
Serial.println(test);
delay(1000);
}
Воспроизвести эту ошибку в этом примере не получилось, но случилось следующее, в процессе работы моего огромного скетча на Raspberry Pi Pico , булевая переменная test, начала неожиданно принимать значение = 10. Потратил кучу времени что бы найти в каком месте скетча это может происходить, хорошо хоть вспомнил, что недавно делал и по горячим следам нашел виновника.
Ну записал я HEX прошивку с помощью USBASP, сторонней программой без загрузчика, установил BOOTRST в 0. МК Atmega32u4 и сейчас прошивка при подаче питания грузится аж 10 сек. почему то, но если "тыкнуть" RESET, то прошивка моментом за 1 секунду загружается, в чем дело?
И зачем было ломать библиотеку SD, а не сделать другую библиотеку? Это совершенно разные типы памяти.
Вы не так поняли меня, я библиотеку SD card вообще не ломал, я только библиотеку для SPIFlash редактировал, добавил туда функции для поддержки FRAM и все. В общем решил (почти решил) эту проблему через одно место...
За счет больших ресурсов Arduino Due, сделал в своем программаторе PortableProg PRO (это мой автономный программатор, для которого все это и затеял, в Youtube есть.), что бы от начала загрузки не использовалось ни одной функции из библиотеки SD, затем содержимое FRAM целиком (всех 2 кБ) считывалось в буфер (переменную), а затем только использую функции библиотеки SD card, что бы сохранить в дамп-файл на SD Card содержимое буфера. Как бы так это все работает отлично, но только вот что делать с верификацией, ее то не проходит т.к. для записи из файла на SD card в SPI FRAM вначале используются функции библиотеки SD (например для открытия файла)?
У меня возникла проблема при чтении SPI FRAM FM25L16B в файл на SD карту - данные искажены, добавляет к некоторым битам логические единицы в то время когда там хранится ноль логический. Если из скетча убрать все функции библиотеки SD, то данные в serial port считывает верные без искажений, но если использовать любую функцию из SD библиотеки то в serial port так же "криво" считывает данные. Кстати с др. SPI флэшками (не FRAM) 25 серии таких проблем нет. И запись FRAM работает отлично из файла на SD Card в FRAM, только естественно верификацию не проходит т.к. не корректно подсчитывает cecksum32 из FRAM.
Библиотеку для spi флэш использовал стандартную лишь добавил в ее свои функции для чтения и записи этой FRAM страницами, все делал по этому даташиту.
Скетчь работает на Ардуино Дуэ:
#include <SD.h>
#include <SPIFlash.h>
#include <SPI.h>
//#include <avr/wdt.h>
#ifdef __SAM3X8E__//если DUE
#define SD_CLOCK 84000000//частота в Гц шины SPI для SD card, для DUE
#endif
#ifndef __SAM3X8E__//если не DUE
#define SD_CLOCK 8000000//частота в Гц шины SPI для SD card, для МЕГА
#endif
byte buf[128];
SPIFlash flash(49, 0);
const int v3_3on = A10; //выход выключателя питания чипов 3,3 Вольта
#define SD_CS 37
File root;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(v3_3on, OUTPUT);
digitalWrite(v3_3on, LOW);//включить питание чипа.
pinMode(SD_CS, OUTPUT);
digitalWrite(SD_CS, HIGH);
delay(4000);
if (!SD.begin(SD_CLOCK,SD_CS)) {
Serial.println(F("SD card failed!"));
}else{
Serial.println(F("SD card OK!"));
}
delay(2000);
while (!Serial);
if (flash.initialize())
Serial.println("Init OK!");
else
Serial.println("Init FAIL!");
delay(5000);
/*
if(SD.exists(F("SPI/damps/test.bin")) == true){//проверка есть ли файл дампа
SD.remove(F("SPI/damps/test.bin")); //если есть, то удалить
}
*/
for(int p = 0; p < 16; p++){
read_fram( p*128, 128);
}
digitalWrite(v3_3on, HIGH);//
}
void read_fram(word addr, word len){
digitalWrite(SD_CS, HIGH);
flash.readBytes_fram(addr, buf, len);//считывает 1-у страницу в буфер
Serial.print(F("Fram read to offseet 0x"));
Serial.println(addr, HEX);
for(int s = 0; s < len; s ++){
Serial.print(F("0x"));
if(buf[s] <= 0xF)Serial.print('0');
Serial.print(buf[s],HEX);
Serial.print(F(", "));
if((s+1)%16 == 0){
Serial.print(F(" | "));
for(int c = (s-16); c < s; c++){
Serial.print((char)buf[c]);
Serial.print(F(", "));
}
Serial.println();
}
}
Serial.println();
root = SD.open("SPI/damps/test.bin", FILE_WRITE);
root.seek(addr);//установить курсор в нужную позицию
root.write(buf, len);//записываем данные в файл
root.close();//закрываем файл.
delay(10);
}
void loop() {
// put your main code here, to run repeatedly:
}
uint8_t TwoWire::endTransmission(uint8_t sendStop) {
uint8_t error = 0;
// transmit buffer (blocking)
TWI_StartWrite(twi, txAddress, 0, 0, txBuffer[0]);
if (!TWI_WaitByteSent(twi, XMIT_TIMEOUT))
error = 2; // error, got NACK on address transmit
if (error == 0) {
uint16_t sent = 1;
while (sent < txBufferLength) {
TWI_WriteByte(twi, txBuffer[sent++]);
if (!TWI_WaitByteSent(twi, XMIT_TIMEOUT))
error = 3; // error, got NACK during data transmmit
}
}
if (error == 0) {
if(sendStop == true) {// вот здесь я дописал
TWI_Stop(twi);
}
if (!TWI_WaitTransferComplete(twi, XMIT_TIMEOUT))
error = 4; // error, finishing up
}
txBufferLength = 0; // empty buffer
status = MASTER_IDLE;
return error;
}
И чего ж ты хочешь?
Что бы показали как правильно нужно сделать.
Krepton85 пише:... это фэйк.
Как исправить эту функцию что бы она работала так же замечательно как на AVR микроконтроллерах?
В архиве библиотека wire для для Ардуино DUE. http://forum.arduino.ua/img/members/1759/Wire_DUE.rarСамостоятельно! Вы также можете обсудить эту проблему с её разработчикми. Отут: https://github.com/arduino/ArduinoCore-sam/issues
Действительно моя проблема уже поднималась здесь: https://github.com/arduino/ArduinoCore-sam/issues/70 но ни кто так и не решил ее.
Я пробовал сам исправить но тогда данная функция возвращает ошибку error 3, при попытке использовать false.
Есть проблема с функцией Wire.endTransmission(stop) для Ардуино DUE, эта функция игнорирует аргумент stop , когда я отправляю команду Wire.endTransmission(false) то все равно выполняется команда Wire.endTransmission(true), это делает не возможным использовать RESTART с последующей командой Wire.requestFrom();
Заглянул в библиотеку wire.cpp
uint8_t TwoWire::endTransmission(uint8_t sendStop) {
uint8_t error = 0;
// transmit buffer (blocking)
TWI_StartWrite(twi, txAddress, 0, 0, txBuffer[0]);
if (!TWI_WaitByteSent(twi, XMIT_TIMEOUT))
error = 2; // error, got NACK on address transmit
if (error == 0) {
uint16_t sent = 1;
while (sent < txBufferLength) {
TWI_WriteByte(twi, txBuffer[sent++]);
if (!TWI_WaitByteSent(twi, XMIT_TIMEOUT))
error = 3; // error, got NACK during data transmmit
}
}
if (error == 0) {
TWI_Stop(twi);
if (!TWI_WaitTransferComplete(twi, XMIT_TIMEOUT))
error = 4; // error, finishing up
}
txBufferLength = 0; // empty buffer
status = MASTER_IDLE;
return error;
}
И что мы видим, что аргумент uint8_t sendStop переданный в функцию
в самой функции не где не используется, это фэйк.
Как исправить эту функцию что бы она работала так же замечательно как на AVR микроконтроллерах?
В архиве библиотека wire для для Ардуино DUE. Wire_DUE.rar
Все добрый день!
Есть проект на GitHub:
https://github.com/spacehuhn/esp8266_deauther
Из него создали bin файл прошивки для Arduino:
https://github.com/spacehuhn/esp8266_deauther/releases/download/v.1.5/esp8266_deauther_1mb.bin
Как из этих файлов получить один bin? Хочу просто немного подредактировать проект под себя (добавить перевод и тп).
Так это же для esp8266 . Просто установите пакет для разработчиков esp8266 в arduino ide. И там скомпелируется скетчь.
Сторінки 1