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.

AM335X SPI异常



由于刚接触AM335X,在测试官方提供的Demo示例mcspiFlash时,发现读出来的永远是0xFF,不知道问题在哪里。原理图上也是SPI0,管角全是SPI0的默认管角功能,希望能够给予帮助,谢谢。

主函数部分: 
  /* Enable the clocks for McSPI0 module.*/
    McSPI0ModuleClkConfig();

    /* Perform Pin-Muxing for SPI0 Instance */
    McSPIPinMuxSetup(0);

    /* Perform Pin-Muxing for CS0 of SPI0 Instance */
    McSPI0CSPinMuxSetup(0);

    /* Initialize the UART utility functions */
    //UARTStdioInit();

    //UARTPuts("Here the McSPI controller on the SoC communicates with", -1);
    //UARTPuts(" the SPI Flash.\r\n\r\n", -1);

    /* Enable IRQ in CPSR.*/
    IntMasterIRQEnable();

    /* Map McSPI Interrupts to AINTC */
    McSPI0AintcConfigure();

    /* Do the necessary set up configurations for McSPI.*/
    McSPISetUp();



unsigned int McSPIPinMuxSetup(unsigned int instanceNum)
{
    unsigned int profile = 2;
    unsigned int status = FALSE;

    switch (profile)
    {
        case 2:
            HWREG(SOC_CONTROL_REGS + CONTROL_CONF_SPI0_SCLK) = 
                 (CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_PUTYPESEL |
                  CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_RXACTIVE);          
            HWREG(SOC_CONTROL_REGS + CONTROL_CONF_SPI0_D0) =
                 (CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_PUTYPESEL |
                      CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_RXACTIVE);      
            HWREG(SOC_CONTROL_REGS + CONTROL_CONF_SPI0_D1) =               
                 (CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_PUTYPESEL|
                  CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_RXACTIVE);
            status = TRUE;
        break;
        default:
        break;
    }
    return status;
}




unsigned int McSPI0CSPinMuxSetup(unsigned int csPinNum)
{
    unsigned int profile = 2;
    switch (profile)
    {
        case 2:
            HWREG(SOC_CONTROL_REGS + CONTROL_CONF_SPI0_CS0) =              
                 (CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_PUTYPESEL | 
                  CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_RXACTIVE);
            return TRUE;
        default:
        break;
    }
    return FALSE;
}
  • 你是在自己的板子上进行的测试,还是在官方的GPEVM板上进行的测试?如果是自己的板子,一定要注意核查EEPROM的逻辑辨别这里。

    另外,可以直接通过读取寄存器的值,来确认你的pinmux之类的设置是否真正的生效了,没有生效的话,说明还是在前面的逻辑处理中有问题。

  • 您用的是starterware吗?跑在哪个板子上?

  • 谢谢你的回复。

    1)我使用的是自己的板子进行测试的,我能够确认的是当有数据发送时,SPIEN都能够被拉低。

    2)我直接发送读它的ID命令,但是读出来的全是0.

  • 谢谢你的回复。

    我是在自己的板子上跑的。我直接发送读ID命令,能够确认SPIEN能够被拉低,但是收到的全是0。

  • pinmux中的模式设置是否正确?receive enable是否有打开?

  •  谢谢你的回复。管脚接的是默认管脚,配制采用的是Demo中的示例。

    unsigned int McSPIPinMuxSetup(unsigned int instanceNum)
    {
        unsigned int profile = 2;
        unsigned int status = FALSE;
    
        if (0 != instanceNum)
        {
            return FALSE;
        }
    
        //profile = EVMProfileGet();
        switch (profile)
        {
            case 2:
                HWREG(SOC_CONTROL_REGS + CONTROL_CONF_SPI0_SCLK) = 
                     (CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_PUTYPESEL |
                      CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_RXACTIVE);          //!< 管脚默认功能(输入/输出) SPIO_CLK A17
                HWREG(SOC_CONTROL_REGS + CONTROL_CONF_SPI0_D0) =
                     (CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_PUTYPESEL |
                      CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_RXACTIVE);          //!< 管脚默认功能  SPI0_D0  B17
                HWREG(SOC_CONTROL_REGS + CONTROL_CONF_SPI0_D1) =                //!< 管脚默认功能  SPI0_D1  B16
                     (CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_PUTYPESEL|
                      CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_RXACTIVE);
                status = TRUE;
            break;
            default:
            break;
        }
        return status;
    }
    
    unsigned int McSPI0CSPinMuxSetup(unsigned int csPinNum)
    {
        unsigned int profile = 2;
    
        if (0 != csPinNum)
        {
            return FALSE;
        }
    
        //profile = EVMProfileGet();
    
        switch (profile)
        {
            case 2:
                HWREG(SOC_CONTROL_REGS + CONTROL_CONF_SPI0_CS0) =               //!< 管脚默认功能 SPI0_CS0   A16
                     (CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_PUTYPESEL | 
                      CONTROL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_RXACTIVE);
                return TRUE;
            default:
            break;
        }
        return FALSE;
    }

    接收使用打开了,不管发送什么命令,收到的全是FF。

  • 谢谢你的回复。关于这个示例,我必须将D0\D1管脚方向做如下修改后,SPID0才有输出,但是SPID1管脚一直没有输入,其它的信号都有。

    static void McSPISetUp(void)
    {
    
        /* Reset the McSPI instance.*/
        McSPIReset(SOC_SPI_0_REGS);
    
        /* Enable chip select pin.*/
        McSPICSEnable(SOC_SPI_0_REGS);
    
        /* Enable master mode of operation.*/
        McSPIMasterModeEnable(SOC_SPI_0_REGS);
    
        /* Perform the necessary configuration for master mode.*/
        McSPIMasterModeConfig(SOC_SPI_0_REGS, MCSPI_SINGLE_CH,
                              MCSPI_TX_RX_MODE, MCSPI_DATA_LINE_COMM_MODE_6,//MCSPI_DATA_LINE_COMM_MODE_1
                              chNum);
    
        /* Configure the McSPI bus clock depending on clock mode. */
        McSPIClkConfig(SOC_SPI_0_REGS, MCSPI_IN_CLK, MCSPI_OUT_FREQ, chNum,
                       MCSPI_CLK_MODE_0); //MCSPI_CLK_MODE_0
    
        /* Configure the word length.*/
        McSPIWordLengthSet(SOC_SPI_0_REGS, MCSPI_WORD_LENGTH(8), chNum);
    
        /* Set polarity of SPIEN to low.*/
        McSPICSPolarityConfig(SOC_SPI_0_REGS, MCSPI_CS_POL_LOW, chNum);
    
        /* Enable the transmitter FIFO of McSPI peripheral.*/
        McSPITxFIFOConfig(SOC_SPI_0_REGS, MCSPI_TX_FIFO_ENABLE, chNum);
    
        /* Enable the receiver FIFO of McSPI peripheral.*/
        McSPIRxFIFOConfig(SOC_SPI_0_REGS, MCSPI_RX_FIFO_ENABLE, chNum);
    }
  • 谢谢你的回复。关于官网提供的SPI_FLASH示例,我必须做如下修改,SPID0才会有输出,而SPID1就是没有输入,其它的信号都有。

    static void McSPISetUp(void){
    ...
        /* Perform the necessary configuration for master mode.*/
        McSPIMasterModeConfig(SOC_SPI_0_REGS, MCSPI_SINGLE_CH,
                              MCSPI_TX_RX_MODE, MCSPI_DATA_LINE_COMM_MODE_6,//MCSPI_DATA_LINE_COMM_MODE_1
                              chNum);
    ...
    }

    我发的是9F命令,读取ID,但是SPID1信号一直是高电平(FF)。