ich versuche bei meinem mp3-player den byte-transfer zum vs1053 über isr
zu führen.
1 | void read_file_exti(){
|
2 |
|
3 | fileSize=(sizeof(vs_buffer)/32)*32;//rest wird zur Vereinfachung abgeschnitten
|
4 | pt_vs_buffer=fileSize+1;
|
5 |
|
6 | fat_res=f_open(&File[0], cur_fname, FA_OPEN_EXISTING | FA_READ); /* Create a file */
|
7 | #if 01
|
8 | while (fat_res==0){
|
9 | //==================================================================
|
10 |
|
11 | //1. Lesebedingung prüfen
|
12 | if(pt_vs_buffer>=fileSize){
|
13 | fat_res = f_read(&File[0], vs_buffer, sizeof vs_buffer, &fat_bitct); /* Read a chunk of src file */
|
14 | pt_vs_buffer=0;
|
15 | //2. fileende erreicht?
|
16 | if (fat_res || fat_bitct == 0){
|
17 | //eof => close file
|
18 | f_close(&File[0]);
|
19 | vs_status &= ~(1<<0);
|
20 | //eof => open next file
|
21 | break;
|
22 | } /* error or eof */
|
23 | }//1.
|
24 |
|
25 | u32 i;// = 0,x=0,xx=0;
|
26 |
|
27 |
|
28 | //3. isr if statt while end of buffer?
|
29 | while (pt_vs_buffer < fileSize) {
|
30 | // if (pt_vs_buffer < fileSize) {
|
31 |
|
32 | //+++++++++++++++++++++
|
33 |
|
34 | vs_status |= (1<<0);//isr zuschalten
|
35 | while (dreq==0){;} //in isr nicht erforderlich
|
36 | //Hier müsste die isr einsetzen
|
37 |
|
38 | xdcs_l;
|
39 | for (i = 0; i < 32; i++) {
|
40 | vs_spi_byte(*(vs_buffer+pt_vs_buffer+i));
|
41 | }
|
42 | xdcs_h;
|
43 |
|
44 | //------------------
|
45 |
|
46 |
|
47 | pt_vs_buffer += 32;
|
48 | }
|
49 |
|
50 | //==================================================================
|
51 | }//while (fat_res==0){
|
52 | #endif
|
53 | //+++++++++++++++++++++++++++++++++++++++
|
54 | //---------------------------------------
|
55 | }
|
56 |
|
57 | void EXTI1_x_IRQHandler(void)
|
58 | {
|
59 | if(EXTI_GetITStatus((1<<kk_exti_pin)) != RESET)
|
60 | {//============================================
|
61 | if(vs_status & (1<<0)){
|
62 | if (!timer_ledoff){timer_ledoff=100;}
|
63 | u32 i;// = 0,x=0,xx=0;
|
64 |
|
65 | // vs_write32Byte(vs_buffer,pt_vs_buffer);
|
66 |
|
67 | ...
|
nach
vs_status |= (1<<0);//isr zuschalten
while (dreq==0){;} //in isr nicht erforderlich
müsste die ISR/rising_edge Aufgerufen werden, weil dreq/pinA8 auf high
geht.
Beim vs1053-Beschreiben im Hauptprogramm blinkt die in der isr
aufgerufene led.
Nehme ich das Senden aus dem Hauptprogramm raus, wird die isr nicht mehr
angessprungen obwohl dreq aus der Warteschleife heraus - also auf high _
geht.
Jemand eine Idee? Oder noch besser fertigen vs1053-isr code?