| ??? 10/24/08 19:31 Read: times |
#159318 - bit banged spi on ds89C420 for sd card |
Hello, i'm trying to connect a sd card to my ds89C420 via bit banged spi. Without success... Someone has an idea seeing the code hereunder ?
/*------------------------------------------------------------------------------
spi.C
------------------------------------------------------------------------------*/
#include <REG420.H>
#include <stdio.h>
#include <intrins.h>
#define N_OF_SPI_BYTES 6
/* pin definition */
sbit CS=P1^1;
sbit SCK=P1^2;
sbit MOSI=P1^3;
sbit MISO=P1^4;
/* global variable*/
unsigned char data spidata[N_OF_SPI_BYTES] ;
unsigned char bdata spitmp;
sbit spitmp7=spitmp^7 ;
sbit spitmp6=spitmp^6 ;
sbit spitmp5=spitmp^5 ;
sbit spitmp4=spitmp^4 ;
sbit spitmp3=spitmp^3 ;
sbit spitmp2=spitmp^2 ;
sbit spitmp1=spitmp^1 ;
sbit spitmp0=spitmp^0 ;
/* definition fonction */
void spireadwrite(char nbre_byte, char delayclock);
void initsd(void);
void delay(char pauseclock);
void sendcmd(char cmd,char arg1,char arg2,char arg3,char arg4,char crc);
/* generation de pause */
void delay(char pauseclock)
{
unsigned char i;
for(i=0;i==pauseclock;i++)
{
_nop_();
}
}
/* fonction envoi reception spi */
void spireadwrite(char nbre_byte, char delayclock)
{
unsigned char data i = nbre_byte-1;
while(1)
{ spitmp=spidata[i];
MOSI=spitmp7;SCK=1;delay(delayclock);spitmp7=MISO;SCK=0;delay(delayclock);
MOSI=spitmp6;SCK=1;delay(delayclock);spitmp6=MISO;SCK=0;delay(delayclock);
MOSI=spitmp5;SCK=1;delay(delayclock);spitmp5=MISO;SCK=0;delay(delayclock);
MOSI=spitmp4;SCK=1;delay(delayclock);spitmp4=MISO;SCK=0;delay(delayclock);
MOSI=spitmp3;SCK=1;delay(delayclock);spitmp3=MISO;SCK=0;delay(delayclock);
MOSI=spitmp2;SCK=1;delay(delayclock);spitmp2=MISO;SCK=0;delay(delayclock);
MOSI=spitmp1;SCK=1;delay(delayclock);spitmp1=MISO;SCK=0;delay(delayclock);
MOSI=spitmp0;SCK=1;delay(delayclock);spitmp0=MISO;SCK=0;delay(delayclock);
spidata[i]=spitmp;
if (i==0) break;
i--;
}
}
/* envoi des commandes SD*/
void sendcmd(char cmd,char arg1,char arg2,char arg3,char arg4,char crc)
{
spidata[5]=cmd;
spidata[4]=arg1;
spidata[3]=arg2;
spidata[2]=arg3;
spidata[1]=arg4;
spidata[0]=crc;
spireadwrite(6,100);
}
/*initialisation de la sd*/
void initsd(void)
{
unsigned char j;
unsigned char success;
CS=1;
SCK=0;
success=0;
printf ("Envoi 80 clk - debut\n");
sendcmd(0xff,0xff,0xff,0xff,0xff,0xff);
sendcmd(0xff,0xff,0xff,0xff,0xff,0xff);
printf ("Envoi 80 clk - fin\n");
CS=0;
delay(250);
printf ("Envoi cmd0\n");
spidata[0]=0x0ff;
spireadwrite(1,100);
sendcmd(0x40,0x00,0x00,0x00,0x00,0x95);
printf ("Cmd0 envoyée attente rep\n");
for(j=0;j<10;j++)
{
spidata[0] =0x0ff ;
spireadwrite(1,100) ;
printf("rep sd : %c\n",spidata[0]);
if (spidata[0] ==1)
{
printf(" rep sd spi mode ok\n");
success=1;
break;
}
}
if(success==1)
{ printf("fin cmd0 : succes !\n");}
else
{ printf("fin cmd0 : erreur !\n");}
success=0;
printf ("Envoi cmd55\n");
sendcmd(0x77,0x00,0x00,0x00,0x00,0xFF);
printf ("cmd55 envoyée attente rep\n");
for(j=0;j<10;j++)
{
spidata[0] =0x0ff ;
spireadwrite(1,10) ;
printf("sd rep : %c\n",spidata[0]);
if (spidata[0] ==0)
{
printf(" rep sd cmd55 ok\n");
success=1;
break;
}
}
if(success==1)
{ printf("fin cmd55 : succes !\n");}
else
{ printf("fin cmd55 : erreur !\n");}
success=0;
printf ("Envoi de acmd41\n");
sendcmd(0x69,0x00,0x00,0x00,0x00,0xFF);
printf ("Commande 41 envoyée attente reponse\n");
for(j=0;j<10;j++)
{
spidata[0] =0x0ff ;
spireadwrite(1,10) ;
printf("carte sd rep : %c\n",spidata[0]);
if (spidata[0] ==0)
{
printf(" rep sd acmd41 ok : sd idle\n");
success=1;
break;
}
}
if(success==1)
{ printf("fin cmd41 : succes !\n");}
else
{ printf("fin cmd41 : erreur !\n");}
}
void main (void) {
SCON0 = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 253; /* TH1: reload value for 9600 baud @ 11.0592MHz */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
printf ("Hello World\n");
CS=1;
SCK=0;
initsd();
while (1) {
}
}
|
| Topic | Author | Date |
| bit banged spi on ds89C420 for sd card | 01/01/70 00:00 | |
| Some notes about the code | 01/01/70 00:00 | |
| some more details | 01/01/70 00:00 | |
| Have you found the "real" specification? | 01/01/70 00:00 | |
| Keil logic analyzer | 01/01/70 00:00 | |
| GIGO - verify with the so-called standard | 01/01/70 00:00 | |
| I agree ! | 01/01/70 00:00 | |
| More comments | 01/01/70 00:00 | |
| some answers | 01/01/70 00:00 | |
| Have you considered.... | 01/01/70 00:00 | |
3V3 to 5V is easily accomplished .. | 01/01/70 00:00 | |
| To Show My Point | 01/01/70 00:00 |



