Цитата(prottoss @ Sep 13 2013, 15:48)

А на какой частоте работает ДМА выясняли?
Я ее не мерял, но судя по схеме в документации (стр. 90 Doc ID 13902 Rev 12 для STM32F10x) они тактируются частотой AHB, то есть ядра. В моем случае это 24 или 48MHz.
Цитата(_Pasha @ Sep 13 2013, 14:29)

А на <12MHZ работает?
Имеется ввиду SPI? Нет, не понижал. Однако наверняка будет работать стабильней, т.к. частота ошибки растет с увеличением частоты SPI (как я писал, SPI у меня - половина такта процессора). Но понижение частоты - не решение, пока не разобрался с первопричиной.
Думаю,
adnega здесь привел самую разумную гипотезу с первоначальной задержкой DMA. Потому и отличие всего в один байт в итоге. Ведь и готовность приема возникает на один SPI такт позже, чем готовность передатчика. То есть, SPI уже начала передачу второго байта, а флаг RXNE только взводится. То есть, при 24MHz SPI остается всего 292нс (7 битов) на то, чтобы вычитать принятый байт, пока он не затерся новым. У меня в системе есть еще другой DMA, который обслуживает ADC. Он тоже на шину лезет, хотя приоритет его и ниже читающего из SPI. Но ведь и на арбитраж время нужно...
Вот походил, подумал о work around. Если изначально загрузить в TX DMA счетчик 1, разрешить прерывание по TC, пихнуть DMA и в прерывании дозагрузить счетчик N-1, то этим можно ввести паузу между первым и последующими байтами.
Сообщение отредактировал KnightIgor - Sep 13 2013, 22:13