Ecris bloc (512 octets) à la console MMC

S

Siswanto

Guest
Chers tous,
Je le développement de projets utiliser MMC, j'avais réussi à faire reset et initialiser la MMC, mais quand je veux écrire bloc (CMD24) à la MMC, la réponse est étrange
de données, il est 0xE0 (le bon est 0xE5).l'un peut m'aider, ce que l'erreur?merci
Siswa

 
Tout d'abord vérifier votre tension d'alimentation pour MMC aussi ajouter quelques bouchons de blocage, si vous utilisez MMC avec MCU ..

 
Assurez-vous d'ajuster la taille des paquets de 512 octets ....

Initialize_MMC ();
MMC_PacketSize (2,0), / / 512 Byte
MMC_SELECT;void MMC_PacketSize (char packetmsb, char packetlsb)
(
PRT0DR & = ~ 0x04; / / MMC permettant
delay50ms ();
SPISend (0x40 | 16,0 X00, 0x00, packetmsb, packetlsb, 0x95); / /
Définit la longueur de bloc de 128 octets de transfert de données
SPIM_1_bReadRxData response = ();
PRT0DR | = 0x04 / / MMC permettant
delay50ms ();
)Bientôt, tous les codes wll être disponible gratuitement à electronicsclub.net (pas encore ouvert à l'heure actuelle: 23 décembre 2004, de vérifier après le 4e semaine de janvier 2005)

 
proteus essayer mmc modèle.il enregistre les commandes et des erreurs.Ajouté après 3 minutes:

Désolé, mais vous avez besoin de login pour afficher cette pièce jointe

 
Salut Free_Will,
J'ai besoin d'un exemple de code au début, pouvez-vous donner votre code pour moi??, À long temps d'attente pour mettre votre code dans electronicsclub.net.il est d'environ 1 mois.Siswa

 
J'ai le code source de MMC en mode SPI AVR.Je peux vous envoyer si intéressé.

 
Asit Salut,
S'il vous plaît envoyez moi votre code source, pas de problème, il est pour AVR, je peux faire le portage de lapin (le lapin en utilisant des microprocesseurs I).Btw, votre code est écrit ic C?, Parce que si dans l'assemblage, il est trop difficile à faire le portage.
Vous pouvez télécharger sur ce forum (il jack-up de votre point) ou vous pouvez l'envoyer à mon adresse e-mail
gumbreg (at) yahoo.comSisw

 
Siswanto a écrit:

Asit Salut,

S'il vous plaît envoyez moi votre code source, pas de problème, il est pour AVR, je peux faire le portage de lapin (le lapin en utilisant des microprocesseurs I).
Btw, votre code est écrit ic C?, Parce que si dans l'assemblage, il est trop difficile à faire le portage.

 
Je obtenir de lapin microprocesseur direct de www.rabbitsemi.com, parce que le lapin ne la vendons pas librement dans le marché libre.Chaque lapin qui veulent utiliser des microprocesseurs, doit acheter le compilateur (dinamic C) en premier.et chaque re-order MCU, ils cross-match de votre numéro de client avec les clients de base de données.si vous
n'avez pas de numéro de client, Vous
n'aurez jamais obtenir le MCU.

À propos de MMC:
Je l'ai fait avec succès pour faire reset et initialiser la MMC, mais quand je veux écrire / lire,
j'ai la réponse incorrect.Sisw

 
Ilker et Salut tous,
J'ai fait de simuler l'utilisation proteus MMC MMC modèle
http://www.advdigitaltech.com/, mais le résultat est le même,
lorsque i utilisation réelle du matériel.
Reset et l'initialisation de la MMC, toujours couronnés de succès, mais quand
Je veux lire, je
n'ai jamais MMC correct DATA-JETON (0xFE).
Mon screenshoot de proteus et mon code source (CodevisionAVR)
ci-joint,
s'il vous plaît, aidez-moi.Siswa
Désolé, mais vous avez besoin de login pour afficher cette pièce jointe

 
Asit a écrit:

J'ai le code source de MMC en mode SPI AVR.
Je peux vous envoyer si intéressé.
 
J'ai un peu de demandes pour le Bascom Code de l'interface MMC à AVR.Donc, je me l'envoyer ici.

Il utilise le matériel de SPI ATMEGA162.
Je
n'utilise que 212 octets de chaque secteur, vous pouvez le modifier pour 512 octets.

Pour toutes les commandes,
le stockage adr (adresse) et d'appeler la routine.
Readsector lit dans le secteur en adr indat
écrire secteur Indat écrit à des adr.

Non seulement FAT support direct de lecture et d'écriture.

Reportez-vous à la note d'application de SanDisk pour d'autres commandes.

Utiliser les convertisseurs de niveau si vous utilisez le micro à 5 volts comme MMC ne fonctionne que sur 3,3 volts.A 100 pF contourner le cap sur la ligne d'horloge fonctionne comme étonnant pour intermittente init problèmes.

J'ai utilisé ce code,
la somme depuis longtemps.Si
quelqu'un a / corrections / suggestions moyens poster.

Observe.Alias Cs Portb.4
Ddrb.1 = 1
Ddrb.4 = 1
Ddrb.5 = 1
Ddrb.6 = 0
Ddrb.7 = 1

Dim Indat (212) As Byte A 256

"MMC commnd
Dim. de commande (6) As Byte À 470 '358' & H100
Dim Comm As Byte A 470 Overlay Overlay'358 & H100
Dim Adr As Long À 471 Overlay Overlay'359 & H101
As Byte Dim Trail Au «363
et 475 Overlay Overlay H105

************************************************** ************************
'************************************************* *************************
«Spcr = & B01011100 'Ceci est la MMC puissance spi
Spcr = & B01011101 dernière f/16 00 = 01 = f / 4
Spsr = 0
Declare Sub Getresp
Declare Sub Spiwait
Declare Sub Sendbyte
Declare Sub Sendcmd
Declare Sub Readbyte
Declare Sub Readsector
Declare Sub Writesector
Declare Sub Mmcinit

Declare Sub Cardformat ()
Declare Sub Checkfat
Declare Sub Clearbuffer

Declare Sub Gpsinit
Declare Sub Requête
Declare Sub sendmsg
'Set Mmcpowerappel mmcinit
faire

'Ici mettre toutes les commandes pour mmc.

boucle'======= SOUS ROUTINES ET FONCTIONS pour MMC =======
'____________________________________________________________________
Sous Cardformat ()
# si Debug = 1
Print # 1, "Mise en forme"
# endif

«marque le début du secteur
'Input # 1, "Démarrer", Adr
Adr = & H0000
Comm = & H40 35
Sendcmd
Aresp = 00
Getresp
# si Debug = 1
Si Aresp <> Puis Rbyte
Print # 1, "ADD1 erreur"
End If

# endif
«marque la fin du secteur
'Input # 1, "fin", Adr
Adr = 15360000
"THIS IS
30000 SECTEURS ET 29.999 RECORDS.

Comm = & H40 36
Sendcmd
Getresp
# si Debug = 1
Si Aresp <> Puis Rbyte
Print # 1, "ADD2 erreur"
End If
# endif
'effacer

Comm = & H40 38
Sendcmd
GetrespSi Aresp <> Puis Rbyte
# si Debug = 1
Print # 1, "Format Failed"
# endif
Cls
Lcd "Format Error"
Lowerline
Lcd "Envoyer de la réparation"
Faire
LoopEnd If

'Busy vérifier
# si Debug = 1
Print # 1, "Busy check"
# endif
Readbyte
Alors que Rbyte = 0
Readbyte
Wend
# si Debug = 1
Print # 1, "libre"
# endif
«Maintenant, le formatage est terminé.écrire la signature, en 0ème secteur

Div = "TOTAL SOLUTIONS".
Adr = 0
Writesector

'Format fait

End Sub
'____________________________________________________________________
Sous Getresp ()
Responsewait:
Readbyte
'Pour DEBUG
# si Debug = 1
Print # 1, "RES EST"; Hex (rbyte); ","; "DEBUG
# endif

Pour I = 1 To 255
Si Rbyte = Puis Aresp
Goto Responsedone
End If
Readbyte
# si Debug = 1
Print # 1, Hex (rbyte); ","; "DEBUG
# endif

Ensuite, je

ResponseError:
# si Debug = 1
Print # 1, "Erreur lors de la resp"
# endif
Responsedone:
End Sub'____________________________________________________________________
Sous Spiwait ()
Spiwait1:
'# Debug = 1 si
'Print # 1, "W"
'# endif
sbis spsr, 7
rjmp spiWAIT1
Dbyte = SPDR
End Sub

'____________________________________________________________________
Sous Sendbyte ()
SPDR = Spichar
'# Debug = 1 si
'Print # 1, "S"
'# endif
Spiwait
End Sub

'____________________________________________________________________
Sous Sendcmd ()
Set Cs
Spichar = & HFF
Sendbyte
Reset Cs

«COMMANDEMENT
«COMMANDEMENT
Spichar = Command (1)
Sendbyte
Spichar = Command (5)
Sendbyte
Spichar = Command (4)
Sendbyte
Spichar = Command (3)
Sendbyte
Spichar = Command (2)
Sendbyte
Spichar = Command (6)
Sendbyte

End Sub'____________________________________________________________________
Sous Readbyte ()
Spichar = & HFF
'# Debug = 1 si
'Print # 1, "R"
'# endif
Sendbyte
Rbyte = SPDR
End Sub'____________________________________________________________________
Sous Readsector
«cmd17
Comm = & H40 17
Sendcmd
Aresp = & H00
GetrespSi Rbyte <> Puis Aresp
# si Debug = 1
Print # 1, "erreur dans la commande de lecture"
# endif
Goto Readerror

End IfAresp = & HFE

Getresp

Si Rbyte <> Puis Aresp
# si Debug = 1
Print # 1, "erreur dans la commande de lecture"
# endif
Goto Readerror
End If

'K = 0
Pour K = 1 To 212
Readbyte
Indat (k) = Rbyte
Next K

Pour K = 213 à 512
Readbyte
Suivant

'Imprimer
Exit Sub
Readerror:
Cls
Lcd "PROBLEME DE LECTURE"
Lowerline
Lcd "Envoyer de la réparation"
Faire
LoopEnd Sub

'____________________________________________________________________
Sous Writesector ()
Comm = & H40 24

Sendcmd
Aresp = & H00
GetrespSi Aresp <> Puis Rbyte
# si Debug = 1
Print # 1, "pas accepté d'écrire la commande"
# endif
Goto Writeerror
End If
'maintenant envoyer fe
Reset Cs
Spichar = & HFE
Sendbyte

Pour K = 1 To 212
Spichar = Indat (k)
Sendbyte
Next K
Pour K = 213 à 512
Spichar = & HFF
Sendbyte
Next K

Spichar = & HFF
Sendbyte
Sendbyte
Readbyte
'Imprimer
Dbyte = & Rbyte Et H0F

# si Debug = 1
Print # 1, "la réponse de l'écriture est Rbyte ="; Bin (rbyte)
Print # 1, "Dbyte ="; Bin (dbyte)
# endifSi Dbyte <> & H05 Puis
# si Debug = 1
Print # 1, "l'écriture est infructueuse"
# endif
Goto Writeerror
End If

Exit Sub
Writeerror:
"Le problème est écrit!ne pas accepter d'autres documents.
Cls
Lcd "SAVE PROBLEM"
Lowerline
Lcd "Envoyer de la réparation"
Faire
Loop

End Sub
'____________________________________________________________________
Sous Mmcinit ()

# si Debug = 1
Print # 1, "l'initialisation de MMC"
# endifMmcinitdone = 0
Cmda = 0: CMDB = 0
Set Cs
«Spichar = & HFF
Pour I = 1 To 100
Readbyte
Ensuite, je
Reset Cs

«cmd0
Comm = & H40
Adr = & H00000000
Trail = & H95

«COMMANDEMENT
Spichar = Command (1)
Sendbyte
Spichar = Command (5)
Sendbyte
Spichar = Command (4)
Sendbyte
Spichar = Command (3)
Sendbyte
Spichar = Command (2)
Sendbyte
Spichar = Command (6)
SendbyteAresp = & H01
Getresp

Si Rbyte = Puis Aresp
Cmda = 1
# si Debug = 1
Print # 1, "init erreur dans cmd0 resp est" Hex (rbyte)
# endif
End If
# si Debug = 1
Print # 1, "fait cmd0 resp est" Hex (rbyte)
# endif
«cmd1
Pour K = 1 To 255
Comm = & H41
Trail = & HFF
Sendcmd
Aresp = & H00
Getresp
Si Rbyte = Puis Aresp
CMDB = 1
Goto Cmd1done:
End If
Next K
# si Debug = 1
Print # 1, "erreur dans cmd1 resp =" Hex (rbyte)
# endif
Cmd1done:
"Imprimer" done cmd1, resp est "Hex (rbyte)
"Imprimer" cmda = "; Cmda
"Imprimer" CMDB = "; CMDB

Mmcinitdone = Cmda Et CMDB
# si Debug = 1
Print # 1, "mmcinitdone ="; Mmcinitdone
# endif
End Sub

 
Bonjour, comment peut-on simuler mmc dans proteus?, Parce que quand je tente, il est nécessaire de sélectionner un fichier image de carte multimédia, où puis-je obtenir ce fichier?

 
i utilisé et fonctionne bien.
i wrotes dans winavr.

# ifndef __MOS_MMC__
# define __MOS_MMC__
//===================================
# define GO_IDLE_STATE 0
# define SEND_OP_COND 1
# define SEND_CSD 9
# define SEND_CID 10
# define SEND_STATUS 13
# define SET_BLOCKLEN 16
# define READ_SINGLE_BLOCK 17
# define READ_MULTIPLE_BLOCK 18
# define SET_BLOCK_COUNT 23
# define WRITE_SINGLE_BLOCK 24
# define WRITE_MULTIPLE_BLOCK 25
# define PROGRAM_CSD 27
# define SET_WRITE_PROT 28
# define CLR_WRITE_PROT 29
# define SEND_WRITE_PROT 30
# define TAG_ERASE_GROUP_START 31
# define TAG_ERASE_GROUP_END 36
# define ERASE 38
# define LOCK / UNLOCK 42
# define READ_OCR 58
# define CRC_ON_OFF 59# define SPIDI PINB.6 / / Port B bit 6 (pin7): données (données de MMC)
# define Spido PORTB.5 / / Port B bit 5 (pin6):
les données de (données de MMC)
# define SPICLK PORTB.7 / / Port B bit 7 (pin8): l'horloge
# define SPICS PORTB.4 / / Port B bit 4 (pin5: chip select pour MMC
# define true 1
# define false 0
#
include "delay.h"

char writeSector (long int secteur);
char readSector (long int secteur);
//==================================
# define sectorSize 512
char secteur [sectorSize];
bit mmc_inited = false;
//==================================
SPI char (char d) (
SPDR = d;
while (! (SPSR & (0x80)));
SPDR retour;
)

Command char (char beff, ADRH int, int AdrL)
(
char t;
int i;
/ / Envoie une commande à la console MMC
SPI (0x40 | beff);
SPI (ADRH>> 8);
SPI (ADRH);
SPI (AdrL>> 8);
SPI (AdrL);
SPI (0x95) / / uniquement valable pour l'état de repos de commande
for (i = 0; i <2000 & & (t = SPI (0xFF)) == 0xff; i );
return t;
)
//============
char mmc_init ()
(
int i, t;
SPICS = false;
mmc_inited = false;

SPICS = true; / / désactiver MMC
/ / Start MMC en mode SPI
for (i = 0; i <200; i )
SPI (0xFF) / / envoyer 20 * 8 = 160 impulsions d'horloge
SPICS = false; / / MMC permettant

if (Command (GO_IDLE_STATE, 0, 0)! = 1)
retour t | 0x80;

/ / Si il
n'ya pas de MMC, prg.boucles ici
for (i = 0; i <100 & & (t = Command (SEND_OP_COND, 0, 0)! = 0); i );
if (i> = 100)
retour t | 0x80;

/ / crc off
if (Command (CRC_ON_OFF, 0, 0)! = 0)
retour t | 0x80;

/ /
set longueur de bloc
if (Command (SET_BLOCKLEN, 0, sectorSize)! = 0)
retour t | 0x80;

mmc_inited = true;
SPICS = true;
return 0;
)

char readSector (long int sectorNum)
(
int i;
char t;
SPICS = false;
/ / envoyer la commande
if ((t = Command (READ_SINGLE_BLOCK, sectorNum>> 7, sectorNum <<9))! = 0)
(
SPICS = true;
return t;
)
/ / attendre pour commencer octet: 0xFE
for (i = 1; i <2500 & & SPI (0xff)! 0xFE = i )
if (i == 2500)
(
SPICS = true;
retour 0x80;
)
/ / lire les données
for (i = 0; i <sectorSize; i )
secteur = SPI (0xff);
/ / lire 16 bits crc
SPI (0xff);
SPI (0xff);

SPICS = true;
return 0;
)

char writeSector (long int sectorNum)
(
int i;
SPICS = false;
for (i = 0; i <250 & & (Command (WRITE_SINGLE_BLOCK, sectorNum>> 7, sectorNum <<9)! = 0); i );
if (i == 250)
(
SPICS = true;
return 1;
)

/ / wait to mmc sont prêts
for (i = 0; i <10; i )
SPI (0xFF);
/ / commencer à écrire
SPI (0xFE);
/ / envoi des données
for (i = 0; i <sectorSize; i )
SPI (secteur );
/ / À la fin,
veuillez envoyer 16bit crc
SPI (0xFF);
SPI (0xFF);
/ / obtenir et vérifier la réponse
si ((SPI (0xFF) & 0x1F)! = 0x05)
(
for (i = 0; i <250 & & ((SPI (0xFF) & 0x1F)! = 0x05); i )
if (i == 250)
(
SPICS = true;
return 2;
)
)
/ / Attendre
jusqu'à ce que MMC
n'est pas occupé plus de
if (SPI (0xFF) == 0xff)
(
for (i = 0; i <255 & & (SPI (0xFF) == 0xff); i );
if (i == 255)
(
SPICS = true;
retour 3;
)
)

SPICS = true;
return 0;
)
//====
# endif

 

Welcome to EDABoard.com

Sponsor

Back
Top