LINUX.ORG.RU

История изменений

Исправление 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 байт, то, конечно, это не нужно. Но буферизация всё равно нужна. Тогда в случае, если опрос будет слишком быстрый, считается предыдущее значение, что гораздо лучше мусора.