David Demers

QSPI - Sending more than one packet

Discussion created by David Demers on Mar 20, 2008
Latest reply on Mar 24, 2008 by David Demers
I'm using the M52233Demo board talking to an SPI Slave device. When I try to send 9 packets over SPI using the queue. the data that comes out of the Coldfire part is not what I expect. My code is below;
 
My Clock is good, my CS is help for the whole duration, but the data that comes out is skipping the 1st 3 btyes.
 
If i change my "do" loop to "for" loops I get the same issue.  If I remove the loops and use the code
 
change 1st loop to
MCF_QSPI_QDR   = MCF_QSPI_QDR_CONT |  MCF_QSPI_QDR_BITSE ;
MCF_QSPI_QDR   = MCF_QSPI_QDR_CONT |  MCF_QSPI_QDR_BITSE ;
MCF_QSPI_QDR   = MCF_QSPI_QDR_CONT |  MCF_QSPI_QDR_BITSE ;
 
change 2nd loop to
MCF_QSPI_QDR   = data[0];        
MCF_QSPI_QDR   = data[1];    
MCF_QSPI_QDR   = data[2];
 
It works fine.  ANy suggestions as to how i can do it in a loop? so i can use the saem function for different size transfers.
 
Code:
int spi_flash_program_array(long addr, char* data, int bytecount){ int i, ii; char addr1, addr2, addr3;  char SPI_Command;  if (SPI_FLASH_MODEL == AT25F)  SPI_Command   = AT25F_PROGRAM;               // Status Command else if (SPI_FLASH_MODEL == AT26DF)  SPI_Command   = AT26DF_PROGRAM;               // Status Command      addr1 = (addr & 0xFF0000)>>16;    addr2 = (addr & 0xFF00)>>8;    addr3 = addr & 0xFF;   MCF_QSPI_QMR   = (MCF_QSPI_QMR_MSTR | MCF_QSPI_QMR_BITS(8)  | MCF_QSPI_QMR_BAUD(2)); // Master, 16bits/transfer, 3.75Mhz MCF_QSPI_QDLYR = 0x0000;                // default delays MCF_QSPI_QIR = MCF_QSPI_QIR_SPIF;  MCF_QSPI_QAR   = MCF_QSPI_QAR_CMD; MCF_QSPI_QDR   = MCF_QSPI_QDR_CONT |  MCF_QSPI_QDR_BITSE ; MCF_QSPI_QDR   = MCF_QSPI_QDR_CONT |  MCF_QSPI_QDR_BITSE ; MCF_QSPI_QDR   = MCF_QSPI_QDR_CONT |  MCF_QSPI_QDR_BITSE ; MCF_QSPI_QDR   = MCF_QSPI_QDR_CONT |  MCF_QSPI_QDR_BITSE ;  i=0; do {  MCF_QSPI_QDR   = MCF_QSPI_QDR_CONT |  MCF_QSPI_QDR_BITSE ;   printf("setting up commadn Register...\n",i, i );  i++; } while (i<bytecount); printf("Writting at Address=%#x...\n", addr ); MCF_QSPI_QAR   = MCF_QSPI_QAR_TRANS;              // TX Address MCF_QSPI_QDR   = SPI_Command;               // Status Command MCF_QSPI_QDR   = addr1;                 // Status Command MCF_QSPI_QDR   = addr2;                 // Status Command MCF_QSPI_QDR   = addr3;                 // Status Command  i=0; do {  MCF_QSPI_QDR = data[i];   printf("Writting %#x at Address=%#x...\n",data[i], addr+i );  i++; } while (i<bytecount);    MCF_QSPI_QWR    = MCF_QSPI_QWR_CSIV | MCF_QSPI_QWR_NEWQP(0) | MCF_QSPI_QWR_ENDQP(3+bytecount); // Active Low CS, Transfer 1st slot of Queue   MCF_QSPI_QDLYR = MCF_QSPI_QDLYR_SPE;             // Start Transfer  while( !(MCF_QSPI_QIR & MCF_QSPI_QIR_SPIF )) {  // Spin here waiting for completion      }; printf("Write Complete\n");   return 0;}

 

Outcomes