Всем здрасте!
не покидает меня желание написать загрузчик для заливки прошивки в атмегу по CAN шине.
имеем атмега 328р + SPI CAN контроллер mcp2515 с библиотекой mcp_can.h
для начала в бутлоадере пробую простую логику освоить, чтобы раз в секунду сообщение в CAN выплевывал. Но даже на этом естесственно затык.
написал код в ардуино иде как int main(). убрал из библиотеки стандартные ардуиновские примочки delay и millis и всякие digitalWrite, добился, чтобы код в основной программе нормально заработал.
собрал загрузчик с таким же кодом и тем же файлом библиотеки. через make командую строку . Размер бутлоадера сделал максимальный пока 4кб, фьюзы прошил под это дело тоже. (фьюзы FF F8 FD) . Залил программатором
но сообщения в CAN не идут. поставил через юарт метки , чтобы посмотреть куда заходит программа и вообще не ребутиться ли мк. Но нет, все норм. доходит до лупа и плюется метками в юарт раз в секунду. а в CAN шиш вам.
думал вочдог ресетит мк, но судя по меткам в сериал все норм, на всякий пробовал выключать вочдог.
также думал может что-то с адресами векторов прерываний , вычитал что для загрузчика их надо настраивать на начало адреса загрузчика, но судя по bin файлу прошивки с нулевого адреса везде FF. (и загрузчик лежит там где надо с 0х7000) да и пробовал на всякий случай устанавливать биты IVCE и потом IVSEL - не помогло. скорее всего GCC вектора прерываний делает все как надо уже. Но по итогу в основной программе, где код работает, в самом начале программы отключаю прерывания совсем cli() и CAN при этом работает! видимо прерывания, таймеры вообще для этого не используются.
пока собирал файл прошивки с помощью make, файлы библиотеки CAN и остальные - замучался , компилятору все никак не нравилось . то одного не видит, то другого. Опыта в таких делах у меня маловато мягко говоря. пока за размер борьбы нет, в makefile поставил компилятор g++, чтобы классы библиотек компилировались . По итогу все необходимое для компиляции в один mcp_can.h запихал, чтобы не мучиться с инклюдами всеми и в секции основной программы это заработало, в CAN сообщения идут.
но в секции бутлоадера что-то это не работает. Подскажите, в какую сторону копнуть?
Мне кажется что-то с шиной SPI надо настроить. Есть ли какие то моменты в SPI.h которые могут не работать в бутлоадере?
#include "wiring_private.h"
#include <util/delay.h>
#include "mcp_can.h"
MCP_CAN CAN(10);
byte data[] = {1,2,3,4,5,6,7,8};
int main(void) __attribute__ ((OS_main)) __attribute__ ((section (".init9")));
void putch(char);
int main(void)
{
sei(); // включаем прерывания
//cli(); // выключаем все прерывания
//ниже настройка юарт0 для меток дебага
UCSR0A = _BV(U2X0); //Double speed mode USART0
UCSR0B = _BV(RXEN0) | _BV(TXEN0);
UCSR0C = _BV(UCSZ00) | _BV(UCSZ01);
UBRR0L = (uint8_t)( (F_CPU + 115200L * 4L) / (115200L * 8L) - 1 );
putch(0x31); //1
CAN.begin(MCP_ANY, CAN_250KBPS, MCP_8MHZ);
putch(0x32); //2
CAN.setMode(MCP_NORMAL);
while(1) // loop
{
CAN.sendMsgBuf(0x555, 0, 1, data); // отправляем сообщение в кан
byte incr = 0 ;
while (++incr<200) {_delay_ms(5);} // delay 1 сек
putch(0x51); //q
}
return 0;
}
void putch(char ch) {
while (!(UCSR0A & _BV(UDRE0)));
UDR0 = ch;
}





