This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Unable to Read data On SPI..AM3517.

Other Parts Discussed in Thread: AM3517, SYSCONFIG

Dear All,

I am using AM3517 controller. I am able to transmit data at the rate of i.5 mhz..but not able to receive the data.

#if TX_RX
while(1)
{
    debug_print("\nTransmitting Data");   
    SETBIT_REGL(MCSPI1_CH0_CTRL, SPI_CTRL_EN);              // Activate channel
    
    SETBIT_REGL(MCSPI1_IRQ_STAT, SPI_IRQSTATUS_TX0_EMPTY);  // Clear TX0_EMPTY    
    SETBIT_REGL(MCSPI1_IRQ_STAT, SPI_IRQSTATUS_RX0_FULL);  // Clear TX0_EMPTY        
    SETBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_FORCE);    
    OUT_REGL(MCSPI1_TX0,bCnt++);                            // Send word
    debug_print("Transmitted Data = %x\r\n\n",IN_REGL(MCSPI1_TX0));      


    while(!CHKBIT_REGL(MCSPI1_CH0_STAT,SPI_EOT))
    {
    debug_print("\nWaiting For Eot != %x",IN_REGL(MCSPI1_CH0_STAT));
    }
    
    debug_print("\nWaiting For Eot !!!= %x",IN_REGL(MCSPI1_CH0_STAT));    
    while (!CHKBIT_REGL(MCSPI1_IRQ_STAT, SPI_IRQSTATUS_TX0_EMPTY))
    {
              debug_print("\nWaiting for Transmission...");
    }
    while(!CHKBIT_REGL(MCSPI1_CH0_STAT,SPI_RX_FULL))
    {
    debug_print("\nWaiting For Eot != %x",IN_REGL(MCSPI1_CH0_STAT));
    }
    
    while (!CHKBIT_REGL(MCSPI1_IRQ_STAT, SPI_IRQSTATUS_RX0_FULL))
    {
              debug_print("\nWaiting for RecepTion...");
    }
  debug_print("Received Data = %x\r\n\n",IN_REGL(MCSPI1_RX0));
 
  CLRBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_FORCE);
  CLRBIT_REGL(MCSPI1_CH0_CTRL, SPI_CTRL_EN);         // DE-activate channel
  debug_print("Received Data = %x\r\n\n",IN_REGL(MCSPI1_RX0));  
  USTIMER_delay(1000000);//NC         
}
#endif

the above code is used to tranmit and receive data.

I am transmitting 8 bit data on the MOSI Line. But when i read the RX register the received data is 0x0100..0x0200..0x0300 and so on..and since i am tranmitting 8 bit data.. i am not able to find how the data gets shifted by 8 bit..which keeps the SOMI line LOW.

  • I'm also trying to get the spi port to write/read.  By chance, can you post or email the spi initialization code?  I'm having problems just transmitting the data out.  I can see the chip select line toggling, but I never see any activity on the clock line.

  • Hi david !!

    The Clock will toggle when you write in transmit register. write to the transmit register in while(1) loop and then probe the clock line.

    uint32_t Init_McSpi1(void)
    {    
            
      //RESET
      //SET BIT SOFT RESET FOR THE MODULE
      SETBIT_REGL(MCSPI1_SYSCONFIG,MCSPI1_SYSCONFIG_SOFTRESET);
     
      //MONITOR STATUS REGISTER..IF RESET HAS BEEN DONE..WAIT TILL RESET DONE BIT IS SET
      while (!CHKBIT_REGL(MCSPI1_SYS_STAT, MCSPI1_RESETDONE))
      {
       debug_print("\r\nWaiting... SPI_SYSSTATUS   = 0x%08x\r\n", IN_REGL(MCSPI1_SYS_STAT));  // Wait for reset to complete
      }
     
      //debug_print("Soft Reset Done");
      //DATA LINE 1 Selected for Reception
     
      //Input Direction
      SETBIT_REGL(MCSPI1_SYST,1 << 8);
     
      CLRBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_IS);     // Set somi pin to receive mode
     
      CLRBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_DPE1);   // SERIAL IN MASTER OUT
      SETBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_DPE0);   // SERIAL OUT MASTER IN  
     
    #if ENB_BUFF
    //  SETBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_TURBO);   //  Enable Turbo Mode
    //  SETBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_FFEW);    //  Enable Transmit Buffer
        SETBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_FFER);    //  Enable Receive Buffer
    #endif  
     
      //Set Mode OF Operation..Transmit Receive Mode Selection
    #if  TX_RX
      CLRBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_TRM_1);  //     
      CLRBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_TRM_0);  //
    #endif  

    //0x2 Transmit Only  Mode Selection
    #if TX_ONLY   
      SETBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_TRM_1);  //
      CLRBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_TRM_0);  //
    #endif
     
    //0x1 Receive Only  Mode Selection
    #if  RX_ONLY
      CLRBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_TRM_1);  //
      SETBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_TRM_0);  //
    #endif  
     
    //LoopBack Mode Selection  
    #if  LOOPBACK
      CLRBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_TRM_1);  //
      CLRBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_TRM_0);  //
    #endif    
     
      // PROGRAMMER CAN CHANGE THE WORD LENGTH..SPI WORD is 16 bit Long
      SETBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_WL_0);   // Select word size
      SETBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_WL_1);   //     "
      SETBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_WL_2);   //     "
      SETBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_WL_3);   //     "
      CLRBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_WL_4);   //     "
      //Active Low was commented....
      SETBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_EPOL);   // CS active low
      //Operate At 750 KHZ..
      CLRBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_CLKD_0); // Set clock divider
      SETBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_CLKD_1); //     "
      SETBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_CLKD_2); //     "
      CLRBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_CLKD_3); //     "
     
      CLRBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_POL);    // CLK inactive low
    //  CLRBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_PHA);    // Odd edges sample data
      SETBIT_REGL(MCSPI1_CH0_CONF, SPI_CONF_PHA);    // Odd edges sample data
      //debug_print("Channel COnf = 0x%08x\r\n",IN_REGL(MCSPI1_CH0_CONF));

      //MODULE CONTROL        
      CLRBIT_REGL(MCSPI1_MODULCTRL, SPI_MODULCTRL_MS);         // Provide the clock in master mode
    //  SETBIT_REGL(MCSPI1_MODULCTRL, SPI_MODULCTRL_SINGLE);     // Single mode Enable
      CLRBIT_REGL(MCSPI1_MODULCTRL, SPI_MODULCTRL_SINGLE);   // Single mode disable
    #if LOOPBACK  
      SETBIT_REGL(MCSPI1_MODULCTRL, SPI_SYSTEST);            // Single mode                   //Loopback
      SETBIT_REGL(MCSPI1_SYST,SSB);                                                           //Loopback
      SETBIT_REGL(MCSPI1_SYST,RX_MODE);                                                       //Loopback
    #endif  
        
    //  this register can be used in for Word Count  
    //  SETBIT_REGL(SPI_XFERLEVEL,0x01E00);
      //debug_print("Channel Module CTRL = 0x%08x\r\n",IN_REGL(MCSPI1_MODULCTRL));            
      //debug_print("Channel CH0 CTRL = 0x%08x\r\n",IN_REGL(MCSPI1_CH0_CTRL));   
      SETBIT_REGL(MCSPI1_CH0_CTRL, SPI_CTRL_EN);              // Activate channel
     return(0);
    }

    this is my working intialisation code. Please feel free to post if u have any issues.

    thanks and regard's

    Hrishikesh.

  • Hi david !!

    Some of the comments may not be valid with respect to the code ..as i have not updated the comments.

  • Ok.  I'm looking through it now.  I have been writing to the TX register, but I can't seem to get it to transmit when I'm manually controlling the chip select pin.  I'll let you know if I get it working.  Thank you for your help.

  • I'm able to transmit data using your code, but as soon as I enable SINGLE mode it stops working.  The chip select line toggles like it should, but I never see anything on the clock line.  Have you been able to get SINLGE mode to work?

  • Hi David !!

    Its not possible that you see data on MOSI and no clock. No i didnt try with single mode, i have used the cs in auto mode.

    Try to use two probes..if u are able to catch data simultaneously you should be able to capture clock.

    thanks and Regard's

    Hrishikesh.