Цитата(MikePic @ Oct 16 2008, 10:34)

Причина, возможно, ещё в переменных Flash1_. Где они расположены? Во внешней памяти? Даже если во внутренней, всё-равно простым mov-ом там не обойдётся. Смотрите листинг asm-овский. Попробуйте для эксперимента внутри процедуры создать временную переменную (массив) и читать в него, а потом замерить скорость. Если SPI 8-битный, то в этом случае на приём/передачу уйдёт ~1.3мкс, всё остальное - обработка и дёрганье FIO. Мне на SSI LPC2214/01 удалось получить производительность 2,27мкс/слово (17бит при 14,7456МГц интерфейс, *4 - частота проца), при этом была куча проверок, условий, поддержка протокола, принимаемые и передаваемые данные размещались в эластичном FIFO, который был во внешней SRAM, FIFO LPC не использовал.
У меня keil, который должен оптимизировать не хуже. Переменные в оперативной памяти, SPI 8-бит, частота процессора, как мне кажется 72 МГц, SPI 18 МГц.
Код
volatile unsigned int i;
FIO0CLR = (1<<CS_FLASH1);
SSP1DR = 0x9F;
SSP1DR = 0;
SSP1DR = 0;
SSP1DR = 0;
while ( !(SSP1SR & SSPSR_BSY) );
i = SSP1DR;
Flash1_ManID = SSP1DR;
Flash1_MemType = SSP1DR;
Flash1_MemSize = SSP1DR;
FIO0SET = (1<<CS_FLASH1);
ассемблер получится следующий
Код
16: FIO0CLR = (1<<CS_FLASH1);
0x00000F78 E3A03101 MOV R3,#__RTA_fpDbgIn(0x40000000)
0x00000F7C E3A02040 MOV R2,#0x00000040
0x00000F80 E2433901 SUB R3,R3,#0x00004000
0x00000F84 E583201C STR R2,[R3,#0x001C]
17: SSP1DR = 0x9F;
0x00000F88 E3A00803 MOV R0,#0x00030000
0x00000F8C E3A0109F MOV R1,#0x0000009F
0x00000F90 E280020E ADD R0,R0,#WDMOD(0xE0000000)
0x00000F94 E5801008 STR R1,[R0,#0x0008]
18: SSP1DR = 0;
0x00000F98 E3A01000 MOV R1,#Flash1_DevID(0x00000000)
0x00000F9C E5801008 STR R1,[R0,#0x0008]
19: SSP1DR = 0;
0x00000FA0 E5801008 STR R1,[R0,#0x0008]
20: SSP1DR = 0;
0x00000FA4 E5801008 STR R1,[R0,#0x0008]
21: while ( !(SSP1SR & SSPSR_BSY) );
0x00000FA8 E590100C LDR R1,[R0,#0x000C]
0x00000FAC E3110010 TST R1,#0x00000010
0x00000FB0 0AFFFFFC BEQ 0x00000FA8
22: i = SSP1DR;
0x00000FB4 E5901008 LDR R1,[R0,#0x0008]
23: Flash1_ManID = SSP1DR;
0x00000FB8 E590C008 LDR R12,[R0,#0x0008]
0x00000FBC E59F1384 LDR R1,[PC,#0x0384]
24: Flash1_MemType = SSP1DR;
0x00000FC0 E581C000 STR R12,[R1]
0x00000FC4 E590C008 LDR R12,[R0,#0x0008]
25: Flash1_MemSize = SSP1DR;
0x00000FC8 E581C004 STR R12,[R1,#0x0004]
0x00000FCC E5900008 LDR R0,[R0,#0x0008]
26: FIO0SET = (1<<CS_FLASH1);
0x00000FD0 E5810008 STR R0,[R1,#0x0008]
0x00000FD4 E5832018 STR R2,[R3,#0x0018]
то есть ассемблерных команд не много, а исполняется 3,55 мкс, а сама передача 4 байт занимает 2 мкс. Мне кажется это недостаточно быстро.