Смеркалось.
Подруживаю одноплатник с линуксом с мегой по SPI. Линуксовая часть получилась отменной, а в от самое простое, мега, два дня уже ниче не отвечает.
Мега работает в слейве, на прием все идеально, а в ответ не шлет ни бита. Микруху менял на новую – то же самое. Мега-код:
#define LED_PORT PORTC
#define LED_DDR DDRC
#define LED_PIN PINC
#define LED_BIT PC5
#define PORT_SPI PORTB
#define DDR_SPI DDRB
#define PIN_SPI PINB
#define SCK PB5
#define MISO PB4
#define MOSI PB3
#define SS PB2
#include <avr/io.h>
#include <util/delay.h>
void SPI_init_S (void){
DDR_SPI &= ~(1<<MOSI);
PORT_SPI &= ~(1<<MOSI);
DDR_SPI |= (1<<MISO);
PORT_SPI &= ~(1<<MISO);
DDR_SPI &= ~(1<<SCK);
PORT_SPI &= ~(1<<SCK);
DDR_SPI &= (1<<SS);
PORT_SPI |= (1<<SS);
SPCR = (1<<SPE);
}
unsigned char SPI_WR (unsigned char data_w) {
SPDR = data_w;
while (!(SPSR & (1<<SPIF)));
return (SPDR);
}
int main(void) {
CONFUGURE_PIN_AS_OUTPUT( LED_DDR, LED_BIT );
SET_PIN_LOW( LED_PORT, LED_BIT );
unsigned char data_w = 'B', data_r;
SPI_init_S();
while(1){
data_r = SPI_WR(data_w);
data_r = SPI_WR(data_w);
data_r = SPI_WR(data_w);
if (data_r == 0) SET_PIN_LOW( LED_PORT, LED_BIT );
if (data_r == 255) SET_PIN_HIGH( LED_PORT, LED_BIT );
}
return 0;
}
джва раза перечитал датащит, не пойму что там может не работать. Если укого завалялся гарантированно-рабочий пример – буду признателен.
(проблемы точно не на принимающей стороне, смотрю лог анализатором, даже прямо к ножке припаивался)