Здравствуйте! Начал осваивать МК. Нужно передать данные от одного МК другому по SPI. МК atmega 128. Взял готовую реализацию SPI из datasheet. Вроде ничего сложного. Данные как бы передаются, а в порт ничего не выводится. Подскажите, пожалуйста, неучу, где ошибка.
Как я и думал, это никакие не единицы на SPI, это просто до первой передачи или инициализации нога, которая MOSI висит в "1". Ее при инициализации перед выводом в DDRB нужно сразу в "0" поставить, хотя это не должно влиять на обмен по SPI.
Добрый день. Есть такая, на мой взгляд, не тривиальная задача. Нужно организовать передачу данных между ПЛИС(slave) и МК(master) по SPI. Т.к. с такими системами отладки я не знаком, то не придумал ничего умнее, как на время отладки заменить ПЛИС микроконтроллером с программным SPI. Полазил по форуму и нашел решение программного SPI для mastera и переделал под slave.
#define MOSI PINA.0
#define MISO PORTA.1
#define SS PINA.2
#define SCK PORTB.3
char data[96]; // в плисене в очереди на передачу стоит 96 бит данных. м.б. тип данных тут другой нужен?
unsigned char spi(char *data){
unsigned char mosi = 0;
unsigned char mask = 0x01; // если надо начинать со старшего бита - заменить на 0x80
if (SS==0)
{
for( ; mask; mask <<= 1){ // если надо начинать со старшего бита - заменить на mask >>= 1;
MISO = data & mask;
SCK = 1;
if(MOSI) mosi |= mask;
SCK = 0;
}
}
return mosi;
}
void main(void)
{
//инициализацию портов пропускаю
spi(data);
}
пока возникли 2 вопроса:
1. здесь линия SCK программно настраивается, а в ПЛИС она аппаратная. Как реализовать это здесь сохранив программный SPI?
2. Нужно передать 12 байт данных, а тут после байта программа завершает свою работу. Чего не хватает?
пока возникли 2 вопроса:
1. здесь линия SCK программно настраивается, а в ПЛИС она аппаратная. Как реализовать это здесь сохранив программный SPI?
2. Нужно передать 12 байт данных, а тут после байта программа завершает свою работу. Чего не хватает?
1) Раз у вас МК является ведущим, то так и оставьте. ПЛИС надо только соединить с МК (при наличии конечно конфигурации ПЛИС).
2) Можно сделать просто. Если используется SPI МК - передавать 2 байта один из которых упаковать не полностью или разделить на старший\младший с признаком (полет фантазии неисчерпаем). Если же делается чисто программный протокол (плевать какие выводы МК задействованы), то в рамках него можно сделать передачу и 4 бит и 12 бит и 35 бит - тут опять ничего не держит за руки\ноги\лапы и хвосты
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже