Bonjour,
Je travaille sur un petit projet de C embarqué. Je souhaite communiquer avec une SDHC par l'intermédiaire d'un pic18. Je travaille avec MPLAB avec le compilateur c18. Un autre point est que je débute en C.
Pour l'instant j'essaie simplement de communiquer avec une SD, microchip me proposant des librairies de démonstration pour cela. Je pensais qu'elles fonctionneraient directement une fois les modifications matériel apportées mais ce n'est pas le cas. J'ai quelques erreurs dont celle-ci :
SendMMCCmdManual est définie comme ça dans un .c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 MPLINK 4.32, Linker Copyright (c) 2009 Microchip Technology Inc. Error - could not find definition of symbol 'SendMMCCmdManual' in file './SD-SPI.o'. Errors : 1 Link step failed.
MMC_RESPONSE est déclarée de cette manière dans le .h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 MMC_RESPONSE SendMMCCmd(BYTE cmd, DWORD address) { WORD timeout = 0x8; BYTE index; MMC_RESPONSE response; CMD_PACKET CmdPacket; SD_CS = 0; //Card Select // Copy over data CmdPacket.cmd = sdmmc_cmdtable[cmd].CmdCode; CmdPacket.address = address; CmdPacket.crc = sdmmc_cmdtable[cmd].CRC; // Calc CRC here CmdPacket.TRANSMIT_BIT = 1; //Set Tranmission bit WriteSPIM(CmdPacket.cmd); //Send Command WriteSPIM(CmdPacket.addr3); //Most Significant Byte WriteSPIM(CmdPacket.addr2); WriteSPIM(CmdPacket.addr1); WriteSPIM(CmdPacket.addr0); //Least Significant Byte WriteSPIM(CmdPacket.crc); //Send CRC // see if we are going to get a response if(sdmmc_cmdtable[cmd].responsetype == R1 || sdmmc_cmdtable[cmd].responsetype == R1b || sdmmc_cmdtable[cmd].responsetype == R7) { do { response.r1._byte = MDD_SDSPI_ReadMedia(); timeout--; }while(response.r1._byte == MMC_FLOATING_BUS && timeout != 0); } else if(sdmmc_cmdtable[cmd].responsetype == R2) { MDD_SDSPI_ReadMedia(); response.r2._byte1 = MDD_SDSPI_ReadMedia(); response.r2._byte0 = MDD_SDSPI_ReadMedia(); } if(sdmmc_cmdtable[cmd].responsetype == R1b) { response.r1._byte = 0x00; for(index =0; index < 0xFF && response.r1._byte == 0x00; index++) { timeout = 0xFFFF; do { response.r1._byte = MDD_SDSPI_ReadMedia(); timeout--; }while(response.r1._byte == 0x00 && timeout != 0); } } if (sdmmc_cmdtable[cmd].responsetype == R7) { response.r7.bytewise._returnVal = (DWORD)MDD_SDSPI_ReadMedia() << 24; response.r7.bytewise._returnVal += (DWORD)MDD_SDSPI_ReadMedia() << 16; response.r7.bytewise._returnVal += (DWORD)MDD_SDSPI_ReadMedia() << 8; response.r7.bytewise._returnVal += (DWORD)MDD_SDSPI_ReadMedia(); } mSend8ClkCycles(); //Required clocking (see spec) // see if we are expecting data or not if(!(sdmmc_cmdtable[cmd].moredataexpected)) SD_CS = 1; return(response); }
Voilà, j'espère que vous avez assez d'éléments pour comprendre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 typedef union { RESPONSE_1 r1; RESPONSE_2 r2; RESPONSE_7 r7; }MMC_RESPONSE;
Merci pour votre aide.
guillaume
Partager