När jag skall läsa en sektor, så skriver jag i vanlig ordning till register 2-6 antal sektorer att läsa, samt Sektor LBA, därefter skriver jag kommando 0x20 till kommandoregistret.
Därefter pollar jag statusregistret, men får bara 0x50 tillbaka (drive ready) inte som sig bör 0x58 (drive ready, data available), har i nuläget begränsat till 200 pollningar innan jag timar ut.
EN fundering, jag sätter CS0 i början av funktionen och låter den vara satt hela tiden, kan man göra så, eller behöver man släcka CS0 mellan varje skrivning/läsning.
Använder mig av PIC32MX795F512L och PMP-porten.
Processorn snurrar i 80MHz, PBUS i 40, använder 1,12,3 i waitstates för porten, som jag fattat det så är det enbart den mittersta som spelar roll, dvs längden på Write/Read-stroben, vilket bör ge minst 300 ns, adresslinor och CS sköter jag manuellt.
Portdefinitionen
Kod: Markera allt
#define PMP_CONTROL (PMP_ON | PMP_IDLE_CON | PMP_MUX_OFF | PMP_READ_WRITE_EN | PMP_READ_POL_LO |\
PMP_WRITE_POL_LO | PMP_LATCH_POL_HI )
#define PMP_MODE (PMP_IRQ_OFF | PMP_AUTO_ADDR_OFF | PMP_DATA_BUS_16 | PMP_MODE_MASTER2 |\
PMP_WAIT_BEG_1 | PMP_WAIT_MID_12 | PMP_WAIT_END_3 )
#define PMP_PORT (PMP_PEN_OFF )
#define PMP_INTERRUPT (PMP_INT_OFF)
Kod: Markera allt
uint8 MDD_CFPMP_SectorRead(uint32 sector_addr, uint8 * buffer)
{
uint8 test, error;
uint16 temp, i1;
uint16 i = 0;
mCF_PMP_SEL_CS0;
mCF_PMP_DES_CS1;
MDD_CFPMP_CFwrite( R_COUNT, 1);
MDD_CFPMP_CFwrite( R_SECT, sector_addr);
MDD_CFPMP_CFwrite( R_CYLO, sector_addr>>8);
MDD_CFPMP_CFwrite( R_CYHI, sector_addr>>16);
MDD_CFPMP_CFwrite( R_DRIVE, ((uint8)(sector_addr>>24) & 0xf)|0xe0); // always select card #0
MDD_CFPMP_CFwrite( R_CMD, C_SECTOR_READ);
PMPClearManualAdress();
mPMP_ShortDelay;
// Dummy read to get the first byte
//PMPMasterRead();
mPMP_ShortDelay;
i1=0;
while ((test = MDD_CFPMP_CFread( R_STATUS)) != S_READY)
{
mPMP_ShortDelay;
mPMP_ShortDelay;
i1++;
if (i1==200)
{
while (1); //error disk not ready.
}
// If error flag is set . . .
if (MDD_CFPMP_CFread (R_STATUS) & 0x01)
{
error=MDD_CFPMP_CFread (R_ERROR);
return FALSE;
}
}
//PMPSetManualAdress(R_DATA);
//PMADDR = R_DATA | (PMADDR & 0xC000);
//MDD_CFPMP_CFread (R_DATA);
PMPSetManualAdress(R_DATA);
temp=PMPMasterRead(); //Dummy read
mPMP_ShortDelay;
i=0;
while (i < 512)
{
MDD_CFPMP_CFwait();
temp= PMPMasterRead();
buffer[i++] = (uint8) temp;
buffer[i++] = (uint8) (temp>>8);
mPMP_ShortDelay;
mPMP_ShortDelay;
}
//PMPClearManualAdress();
mCF_PMP_DES_CS0; // CF deselected when done
return TRUE;
} // read_sector
Kod: Markera allt
void MDD_CFPMP_CFwrite( uint8 add, uint16 d)
// add : CF register
// d : data
{
uint32 i;
MDD_CFPMP_CFwait();
PMPSetManualAdress(add);
mPMP_ShortDelay;
PMPMasterWrite(d);
//for (i=0; i< 100000; i++);
mPMP_ShortDelay;
PMPClearManualAdress();
} // CFwrite
Kod: Markera allt
uint16 MDD_CFPMP_CFread( uint8 add)
// add : register address
{
uint16 d;
uint32 i;
MDD_CFPMP_CFwait();
PMPSetManualAdress(add);
d=(uint16) PMPMasterRead();
//MDD_CFPMP_DATABinput;
//for (i=0; i< 100000; i++);
//PMADDR = (uint16)add | (PMADDR & 0xC000);
//d = PMDIN1; // get the data
mPMP_ShortDelay;
PMPClearManualAdress();
return d;
} // CFread
Läsa
Kod: Markera allt
while(mIsPMPBusy());
return(PMDIN);
Kod: Markera allt
while(mIsPMPBusy());
PMDIN = value;