История изменений
Исправление KivApple, (текущая версия) :
Я же сказал, нужны всякие извращения. А если 0xFF тоже допустимое значение? А если надо выдать последовательность байт? Я никогда так не работал с SPI. Всегда делал так:
volatile uint8_t pos;
volatile uint8_t input_data[BUFFER_SIZE];
volatile uint8_t output_data[BUFFER_SIZE];
ISR(SPI_STC_vect) {
input_data[pos] = SPDR;
SPDR = output_data[pos];
pos++;
if (pos >= BUFFER_SIZE) pos = 0;
}
А ещё pos обнуляется в момент перехода CS в низкое состояние по прерыванию. Если пакет содержит лишь 1 байт, то, конечно, это не нужно. Но буферизация всё равно нужна. Тогда в случае, если опрос будет слишком быстрый, считается предыдущее значение, что гораздо лучше мусора.
И да, машины состояний я активно использую. А вот костыли не люблю.
Исправление KivApple, :
Я же сказал, нужны всякие извращения. А если 0xFF тоже допустимое значение? А если надо выдать последовательность байт? Я никогда так не работал с SPI. Всегда делал так:
volatile uint8_t pos;
volatile uint8_t input_data[BUFFER_SIZE];
volatile uint8_t output_data[BUFFER_SIZE];
ISR(SPI_STC_vect) {
input_data[pos] = SPDR;
SPDR = output_data[pos];
pos++;
if (pos >= BUFFER_SIZE) pos = 0;
}
А ещё pos обнуляется в момент перехода CS в низкое состояние по прерыванию. Если пакет содержит лишь 1 байт, то, конечно, это не нужно. Но буферизация всё равно нужна. Тогда в случае, если опрос будет слишком быстрый, считается предыдущее значение, что гораздо лучше мусора.
И да, машины состояний я активно использую.
Исправление KivApple, :
Я же сказал, нужны всякие извращения. А если 0xFF тоже допустимое значение? А если надо выдать последовательность байт? Я никогда так не работал с SPI. Всегда делал так:
volatile uint8_t pos;
volatile uint8_t input_data[BUFFER_SIZE];
volatile uint8_t output_data[BUFFER_SIZE];
ISR(SPI_STC_vect) {
input_data[pos] = SPDR;
SPDR = output_data[pos];
pos++;
if (pos >= BUFFER_SIZE) pos = 0;
}
А ещё pos обнуляется в момент перехода CS в низкое состояние по прерыванию. Если пакет содержит лишь 1 байт, то, конечно, это не нужно. Но буферизация всё равно нужна. Тогда в случае, если опрос будет слишком быстрый, считается предыдущее значение, что гораздо лучше мусора.
И да, машины состояния я активно использую.
Исправление KivApple, :
Я же сказал, нужны всякие извращения. А если 0xFF тоже допустимое значение? А если надо выдать последовательность байт? Я никогда так не работал с SPI. Всегда делал так:
volatile uint8_t pos;
volatile uint8_t input_data[BUFFER_SIZE];
volatile uint8_t output_data[BUFFER_SIZE];
ISR(SPI_STC_vect) {
input_data[pos] = SPDR;
SPDR = output_data[pos];
pos++;
if (pos >= BUFFER_SIZE) pos = 0;
}
А ещё pos обнуляется в момент перехода CS в низкое состояние по прерыванию. Если пакет содержит лишь 1 байт, то, конечно, это не нужно. Но буферизация всё равно нужна. Тогда в случае, если опрос будет слишком быстрый, считается предыдущее значение, что гораздо лучше мусора.
Исходная версия KivApple, :
Я же сказал, нужны всякие извращения. А если 0xFF тоже допустимое значение? А если надо выдать последовательность байт? Я никогда так не работал с SPI. Всегда делал так:
volatile uint8_t pos;
volatile uint8_t input_data[BUFFER_SIZE];
volatile uint8_t output_data[BUFFER_SIZE];
ISR(SPI_STC_vect) {
input_data[pos] = SPDR;
SPDR = output_data[pos];
pos++;
if (pos >= BUFFER_SIZE) pos = 0;
}
А ещё pos обнуляется в момент перехода CS в низкое состояние. Если пакет содержит лишь 1 байт, то, конечно, это не нужно. Но буферизация всё равно нужна. Тогда в случае, если опрос будет слишком быстрый, считается предыдущее значение, что гораздо лучше мусора.