Вт сен 12, 2017 10:13:40
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
void SPI_Init(void)
{
DDRB |= (1 << PB2) | (1 << PB3) | (1 << PB5); //Настроить выводы DDRB на выход
SPCR |= (1<<MSTR)|(1<<SPR0); //Режим мастер, F=Fosc/16
SPCR |=(1<<SPE);//Включить SPI
PORTB |= (1 << PB2);
}
void SPI_Send_byte(char data)
{
PORTB &= ~(1 << PB2);
SPDR = data; //Отправить байт
while(!(SPSR&(1<<SPIF))) ; //Дождаться окончания передачи
PORTB |= (1 << PB2);
}
int main(void)
{
SPI_Init();
_delay_ms(20);
while (1)
{
SPI_Send_byte('H');
}
}
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
void SPI_Init_Slave(void)
{
DDRB &= ~((1<<2)|(1<<3)|(1<<5)); // SCK, MOSI and SS as inputs
DDRB |= (1<<4);
SPCR |= (1<<SPR0);
SPCR |=(1<<SPE); //Включить SPI
SPSR = 0x00; SPDR = 0x00;
}
char SPI_Receive(void)
{
while (!(SPSR & (1 << SPIF)));
return SPDR;
}
int main(void)
{
char letter;
SPI_Init_Slave();
while (1)
{
letter = SPI_Receive();
}
}
Вт сен 12, 2017 10:50:19
Вт сен 12, 2017 11:04:34
Ср сен 13, 2017 05:48:32
Ср сен 13, 2017 06:27:56
Необходимости в этом никакой нет, если инициализация происходит после сброса МК.Demiurg писал(а):В блоке инициализации перед работой с SPI этот флаг нужно сбрасывать
Это в каком ДШ так написано?Demiurg писал(а):нужно сбрасывать записывая в него 1 (даташит).
Человеку надо было посмотреть что принял МК. Регистр SPDR, по факту буферный на сколько я знаю, чтобы в него попали данные из сдвигового регистра надо его прочитать. Протеус , опять же скорее всего, не отображал принятые данные из сдвигового регистра, кроме того это всего-лишь симулятор. А так как переменная была выкинута оптимизатором, то по факту с регистра ничего не читалось.Demiurg писал(а):volatile в вашем случае не обязательно.
Приведите пример, касательно исходника ТС. Лично я не понял как это.Demiurg писал(а):Можно объявить переменную как extern,
Ср сен 13, 2017 06:50:41
volatile != externDemiurg писал(а):volatile в вашем случае не обязательно. Можно объявить переменную как extern
Ср сен 13, 2017 06:56:42
Z_h_e писал(а):Необходимости в этом никакой нет, если инициализация происходит после сброса МК.
Z_h_e писал(а):Demiurg писал(а):нужно сбрасывать записывая в него 1 (даташит).
Это в каком ДШ так написано?
Z_h_e писал(а):Demiurg писал(а):Можно объявить переменную как extern
Приведите пример, касательно исходника ТС. Лично я не понял как это.
Ср сен 13, 2017 07:08:56
Та же чушь, как и про случайные прерывания вдругом топике. Если МК сбросился, значит регистры переинициализированы МК аппаратно.Demiurg писал(а):...МК нештатно сбросился, в регистре каша, а мы делаем чтение-модификация-запись. ...
Я не спрашивал зачем сбрасывать. Вы говорите что сброс данного флага производится записью 1 и ссылаетесь на ДШ. В каком ДШ это написано?Demiurg писал(а): то сброс соответствующих флагов при непосредственном опросе - обязанность программиста.
Вы невнимательно прочитали вопрос ТС и мое объяснение почему так вышло. ТС не видел принятых данных, наблюдая за регистром SPDR (а на самом деле они были и все работало и так).Demiurg писал(а):Да, объявляя ее volatile, вы заставили компилятор не выкидывать соответствующий кусок кода.
Ср сен 13, 2017 07:19:43
Та же песня и с SDR для USART: протеус (и, если не ошибаюсь, даже студия) не понимает, какое содержимое "двойного" регистра показывать при отладке - то, которое было записано из кода, или то, которое было записано из аппаратуры.Z_h_e писал(а):ТС не видел принятых данных, наблюдая за регистром SPDR
Ср сен 13, 2017 07:22:53
Ср сен 13, 2017 07:24:22
Z_h_e писал(а):...
Bit 7 – SPIF0: SPI Interrupt Flag
When a serial transfer is complete, the SPIF Flag is set. An interrupt is generated if SPIE in SPCR is set
and global interrupts are enabled. If SS is an input and is driven low when the SPI is in Master mode, this
will also set the SPIF Flag. SPIF is cleared by hardware when executing the corresponding interrupt
handling vector. Alternatively, the SPIF bit is cleared by first reading the SPI Status Register with SPIF
set, then accessing the SPI Data Register (SPDR).
Ср сен 13, 2017 07:27:46
Ну и прочитайте сами что там написано, а не тупо цитируйте.Demiurg писал(а):Откройте даташит на любой AVR, раздел SPI, сводка регистров, флаг SPIF. Там все увидите.
Это не повод писать ему всякую ересь.Demiurg писал(а):Это товарищ еще неопытный, потому еще и не знает куда смотреть,
Ср сен 13, 2017 07:32:04
ему-то как раз и можно писать ересь, а вот для него писать ересь совсем не стоит. ну или советовать ему...Z_h_e писал(а):Это не повод писать ему всякую ересь
Ср сен 13, 2017 07:40:41
Ср сен 13, 2017 07:46:44
Ср сен 13, 2017 07:52:27
Опять неверно. А так как Вы профессионал, объяснять не буду.Demiurg писал(а):Так, действительно флаг SPIF сбрасывается при чтении SPDR. Но, при ПЕРВОМ чтении!
Я бы сразу написал, но так уверенно на ДШ ссылались. Но это мелочь в целом. А вот случайные какие-то сбросы МК приводящие к случайным состояниям...Demiurg писал(а):Вы лучше сразу уточняйте в следующий раз. Чем сходу обвинять в ереси.
Ср сен 13, 2017 08:24:55
Ср сен 13, 2017 08:46:35
ну вот для atmega8 напримерDemiurg писал(а): таблица регистров ввода-вывода, сбрасываемых аппаратно при сбросе.
причина сброса не важнаDemiurg писал(а):Притом должно быть уточнение, по какой причине был сброс
Ср сен 13, 2017 09:18:11
Я не встречал такого. Может есть конечно где. У STM есть такие, только они не обобщенные для всех, а только для конкретной каждой периферии. Но я ими не пользуюсь, по-моему все равно надо смотреть описание каждого регистра отдельно, а на память свою я давно не полагаюсь, очень она у меня ненадежная .Demiurg писал(а):Должна быть таблица регистров ввода-вывода, сбрасываемых аппаратно при сбросе.
Ср сен 13, 2017 09:22:12