Проблема в том что AT91SAM9G45 не реагирует на данные: флаг не устанавливается, и данные в регистре приема отсутствуют.
Пробовал выдавать данные и на один провод (DATA[0]) и тоже без результатов.
Как я только не пробовал! А в итоге - одно разочарование..
Помогите, пожалуйста, с бедой!!
P.s.: приложил архив проекта (keil), но там много "грязи" из-за того что пробовал по всякому.. В крации это так:
CODE
int main(void)
{
Config();
init_SDcard();
Read_SDcard();
}
void Config(void)
{
AT91C_BASE_PMC->PMC_PCER |= (0x1 << 11); // Enable clock for //11 MCI0 High Speed Multimedia Card Interface 0
AT91C_BASE_PIOA->PIO_PDR |= (0x1<<0) | (0x1<<1) | (0x1<<2) | (0x1<<3) | (0x1<<4) | (0x1<<5); // PIO SDcard
AT91C_BASE_PIOA->PIO_ASR |= (0x1<<0) | (0x1<<1) | (0x1<<2) | (0x1<<3) | (0x1<<4) | (0x1<<5); // PIO SDcard Peripheral A
AT91C_BASE_MCI0-> MCI_CR |= (0x1 << 0);
AT91C_BASE_MCI0-> MCI_DTOR |= 0x00;
AT91C_BASE_MCI0-> MCI_DMA &= ~(1<<8);
AT91C_BASE_MCI0-> MCI_MR = (0x21)| // CLKDIV
(0<<8) | //PWSDIV
(0<<11) | //RDPROOF
(0<<12) | //WRPROOF
(0<<13) | //FBYTE
(0<<14)| //PADV
(512<<16); // BLKLEN
AT91C_BASE_MCI0-> MCI_BLKR = (512<<16) | //BLKLEN
(128<<0); //BCNT
AT91C_BASE_MCI0-> MCI_SDCR = (0x2<<6); // 4 bit bus data
AT91C_BASE_MCI0-> MCI_CSTOR = (0x0F<<0) | //DTOCYC
(0x07<<4); //DTOMUL
}
void Read_SDcard(void)
{
// отправляем размер блока для выдачи
AT91C_BASE_MCI0-> MCI_ARGR = 512; //Send Argument
AT91C_BASE_MCI0-> MCI_CMDR = (16<<0) | // CMDNB Command number
(0x1<<6) | // RSPTYP response type
(0x0<<8) | // SPCMD special command /// was: 0
(0x0<<11) | // OPCMD 1-open drain; 0-PP command
(0x1<<12) | // MAXLAT max latency for command to response
(0x0<<16) | // TRCMD transfer command // was: 0
(0x0<<18) | // TRDIR transfer direction
(0x0<<19) | // TRTYP transfer type
(0x0<<24); // IOSPCMD SDIO special command
while (!(AT91C_BASE_MCI0->MCI_SR & (0x1))){Transmitter_DBGU("Wait_1");}; //Status Register CMDRDY;
//Подаем команду для выдачи нулевого сектора
AT91C_BASE_MCI0-> MCI_ARGR = 0*512; //Send Argument
AT91C_BASE_MCI0-> MCI_CMDR = (17<<0) | // (6) CMDNB Command number
(0x1<<6) | // (2) RSPTYP response type
(0x0<<8) | // (3) SPCMD special command /// was: 0
(0x0<<11) | // (1) OPCMD 1-open drain; 0-PP command
(0x0<<12) | // (1) MAXLAT max latency for command to response
(0x1<<16) | // (2) TRCMD transfer command // was: 0 - No data transfer
(0x1<<18) | // (1) TRDIR transfer direction
(0x5<<19) | // (3) TRTYP transfer type
(0x0<<24) | // (2) IOSPCMD SDIO special command
(0x0<<26) | // (1) ATACS
(0x0<<27); // (1) BOOT_ACK
while(1) { Check_error(); }
}
// Функция проверки статуса регистра
void Check_error(void)
{
Transmitter_DBGU("\n");
Transmitter_DBGU("Check: ");
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<0)){Transmitter_DBGU("CMDRDY ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<1)){Transmitter_DBGU("RXRDY ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<2)){Transmitter_DBGU("TXRDY ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<3)){Transmitter_DBGU("BLKE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<4)){Transmitter_DBGU("DTIP ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<5)){Transmitter_DBGU("NOTBUSY ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<8)){Transmitter_DBGU("MCI_SDIOIRQA ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<12)){Transmitter_DBGU("SDIOWAIT ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<13)){Transmitter_DBGU("CSRCV ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<16)){Transmitter_DBGU("RINDE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<17)){Transmitter_DBGU("RDIRE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<18)){Transmitter_DBGU("RCRCE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<19)){Transmitter_DBGU("RENDE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<20)){Transmitter_DBGU("RTOE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<21)){Transmitter_DBGU("DCRCE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<22)){Transmitter_DBGU("DTOE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<23)){Transmitter_DBGU("CSTOE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<27)){Transmitter_DBGU("XFRDONE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<30)){Transmitter_DBGU("Overrun ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<31)){Transmitter_DBGU("Underrun ");}
Transmitter_DBGU("\n");
}
{
Config();
init_SDcard();
Read_SDcard();
}
void Config(void)
{
AT91C_BASE_PMC->PMC_PCER |= (0x1 << 11); // Enable clock for //11 MCI0 High Speed Multimedia Card Interface 0
AT91C_BASE_PIOA->PIO_PDR |= (0x1<<0) | (0x1<<1) | (0x1<<2) | (0x1<<3) | (0x1<<4) | (0x1<<5); // PIO SDcard
AT91C_BASE_PIOA->PIO_ASR |= (0x1<<0) | (0x1<<1) | (0x1<<2) | (0x1<<3) | (0x1<<4) | (0x1<<5); // PIO SDcard Peripheral A
AT91C_BASE_MCI0-> MCI_CR |= (0x1 << 0);
AT91C_BASE_MCI0-> MCI_DTOR |= 0x00;
AT91C_BASE_MCI0-> MCI_DMA &= ~(1<<8);
AT91C_BASE_MCI0-> MCI_MR = (0x21)| // CLKDIV
(0<<8) | //PWSDIV
(0<<11) | //RDPROOF
(0<<12) | //WRPROOF
(0<<13) | //FBYTE
(0<<14)| //PADV
(512<<16); // BLKLEN
AT91C_BASE_MCI0-> MCI_BLKR = (512<<16) | //BLKLEN
(128<<0); //BCNT
AT91C_BASE_MCI0-> MCI_SDCR = (0x2<<6); // 4 bit bus data
AT91C_BASE_MCI0-> MCI_CSTOR = (0x0F<<0) | //DTOCYC
(0x07<<4); //DTOMUL
}
void Read_SDcard(void)
{
// отправляем размер блока для выдачи
AT91C_BASE_MCI0-> MCI_ARGR = 512; //Send Argument
AT91C_BASE_MCI0-> MCI_CMDR = (16<<0) | // CMDNB Command number
(0x1<<6) | // RSPTYP response type
(0x0<<8) | // SPCMD special command /// was: 0
(0x0<<11) | // OPCMD 1-open drain; 0-PP command
(0x1<<12) | // MAXLAT max latency for command to response
(0x0<<16) | // TRCMD transfer command // was: 0
(0x0<<18) | // TRDIR transfer direction
(0x0<<19) | // TRTYP transfer type
(0x0<<24); // IOSPCMD SDIO special command
while (!(AT91C_BASE_MCI0->MCI_SR & (0x1))){Transmitter_DBGU("Wait_1");}; //Status Register CMDRDY;
//Подаем команду для выдачи нулевого сектора
AT91C_BASE_MCI0-> MCI_ARGR = 0*512; //Send Argument
AT91C_BASE_MCI0-> MCI_CMDR = (17<<0) | // (6) CMDNB Command number
(0x1<<6) | // (2) RSPTYP response type
(0x0<<8) | // (3) SPCMD special command /// was: 0
(0x0<<11) | // (1) OPCMD 1-open drain; 0-PP command
(0x0<<12) | // (1) MAXLAT max latency for command to response
(0x1<<16) | // (2) TRCMD transfer command // was: 0 - No data transfer
(0x1<<18) | // (1) TRDIR transfer direction
(0x5<<19) | // (3) TRTYP transfer type
(0x0<<24) | // (2) IOSPCMD SDIO special command
(0x0<<26) | // (1) ATACS
(0x0<<27); // (1) BOOT_ACK
while(1) { Check_error(); }
}
// Функция проверки статуса регистра
void Check_error(void)
{
Transmitter_DBGU("\n");
Transmitter_DBGU("Check: ");
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<0)){Transmitter_DBGU("CMDRDY ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<1)){Transmitter_DBGU("RXRDY ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<2)){Transmitter_DBGU("TXRDY ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<3)){Transmitter_DBGU("BLKE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<4)){Transmitter_DBGU("DTIP ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<5)){Transmitter_DBGU("NOTBUSY ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<8)){Transmitter_DBGU("MCI_SDIOIRQA ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<12)){Transmitter_DBGU("SDIOWAIT ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<13)){Transmitter_DBGU("CSRCV ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<16)){Transmitter_DBGU("RINDE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<17)){Transmitter_DBGU("RDIRE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<18)){Transmitter_DBGU("RCRCE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<19)){Transmitter_DBGU("RENDE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<20)){Transmitter_DBGU("RTOE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<21)){Transmitter_DBGU("DCRCE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<22)){Transmitter_DBGU("DTOE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<23)){Transmitter_DBGU("CSTOE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<27)){Transmitter_DBGU("XFRDONE ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<30)){Transmitter_DBGU("Overrun ");}
if ((AT91C_BASE_MCI0-> MCI_SR) & (0x1<<31)){Transmitter_DBGU("Underrun ");}
Transmitter_DBGU("\n");
}
В итоге программа выводит сообщения:
"<LF>
Check: CMDRDY TXRDY NOTBUSY XERDONE <LF>
<LF>
Check: CMDRDY TXRDY NOTBUSY XERDONE <LF>
..."