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.

请问TM4C123GH6PZ的SPI读取时,SCLK为什么没有输出时钟信号呢?

Other Parts Discussed in Thread: ADS8371

我想用M4的SPI模块读取外部ADC的数据,但是发现M4的SCLK并没有输出同步时钟。

谢谢!

  • 楼主,

         要不把代码发来看看吧。

  • void InitSPI(void)
    {
                    SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI2);
                    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
                    
                    GPIOPinConfigure(GPIO_PH4_SSI2CLK);
                    //GPIOPinConfigure(GPIO_PH5_SSI2FSS);
                    GPIOPinConfigure(GPIO_PH6_SSI2RX);
                    GPIOPinConfigure(GPIO_PH7_SSI2TX);
            
                    GPIOPinTypeSSI(GPIO_PORTH_BASE, GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_7);
                    
                    SSIConfigSetExpClk(SSI2_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0,SSI_MODE_MASTER,2000000,16);
                    
                    SSIEnable(SSI2_BASE);
            
                    while(SSIDataGetNonBlocking(SSI2_BASE, &buffer1)){}
    }
    
    void SPIRead(void)
    {
                    SSIDataGet(SSI2_BASE, &buffer1);
                    buffer1 &= 0x3FFF;
                    buffer2 = buffer1;
                    UARTprintf("Read: %x", buffer2);
    }
    //-----------------------------------------------------------------------------
    // Ö÷oˉêy:Ïòw25x80D′êy¾Y£¬Ö®oó¶á3ö¡£
    //-----------------------------------------------------------------------------
    int main(void)
    {                    tContext sContext;
        tRectangle sRect;
               char cThisChar; 
                     char ulIdx;
         SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_XTAL_16MHZ |
                       SYSCTL_OSC_MAIN);
        //
        // 3õê¼»ˉ′®¿ú
        //
                    lcd_ili932x_init();                //3õê¼»ˉLCDÇy¶ˉ
        GrContextInit(&sContext, &g_sLcdDisplay);//3õê¼»ˉí¼Dοa
                    lcd_backlight_on();        
               lcd_ili932x_flush(&sContext);
        sRect.sXMin = 0;
        sRect.sYMin = 0;
        sRect.sXMax = GrContextDpyWidthGet(&sContext) - 1;
        sRect.sYMax = 23;                                                                  
        GrContextForegroundSet(&sContext, ClrDarkBlue);
        GrRectFill(&sContext, &sRect);                                          //  ìî3äà¶é«·½¿é
        GrContextForegroundSet(&sContext, ClrWhite);
        GrRectDraw(&sContext, &sRect);                                          //  ¼ó°×é«¿ò¿ò
        GrContextFontSet(&sContext, &g_sFontCm20);
        GrStringDrawCentered(&sContext, "SPI Demo", -1,
                           GrContextDpyWidthGet(&sContext) / 2, 10, 0);        // ÏÔê¾êμÑé±êÖ¾
        InitConsole();//′®¿ú3õê¼»ˉ
              InitSPI();
                    InitGPIO();
                    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);                                               // ê1ÄüLEDËùÔú¶Ë¿úPH        
        GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_7); //ÅäÖÃPN.4ÎaledμÆêä3ö 
        GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_7,GPIO_PIN_7);
                    SysCtlDelay((SysCtlClockGet()/1));                     // é趨ÿ′ÎÑóê±ê±¼ä£¬t=1 Ñóê±Îa1ms
    
                    while(1){
                            GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_7,0);
                            UARTprintf("start  /n");
                            //GrStringDraw(&sContext,"SPI is Reading...", -1, 30, 80, 1);        //′òó¡DÅÏ¢
                            SPIRead();
                            GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_7,GPIO_PIN_7);
                            UARTprintf("  done /n");
                            //GrContextFontSet(&sContext, &g_sFontCm20);//
                            //sprintf(dis,"SPI Read: %x",buffer2);
                            //GrStringDraw(&sContext,dis, -1, 30, 80, 1);        //′òó¡DÅÏ¢
                    }
    }
    
  • 没太看明白SSI读取函数里面的数据处理是啥意思,

    不过对于SSI来说,需要读取数据时要先发送数据,这样SSI主设备才会产生时钟,发送数据的同时,接收到的数据也会存入buffer,再调用

    SSIDataGet就可以把数据读出来。
  • 感谢您的回复!

    可是我想要读取AD的数据,而不想往AD写数据,因此我该发送什么数据呢?

    发送数据的时候有时钟输出,那发送数据结束后要获取数据时就没有时钟了呢?

    SSI读取函数的数据处理是为了去掉高位不需要的,因为AD只有14位

  • 随便发,0xff或者0x00都行,无所谓的。SPI的机制就是这样。

    针对外部这种SPI接口的ADC,我认为在读取数据之前也是需要写入一些控制命令或者寄存器寻址的信息,然后再读,才能把数据读出来。

  • 您好!

    我现在使用的一款ADS8371芯片,这块芯片只有数据输出,没有数据输入,我不知道该怎么用您之前提过的方法?

    我使用软件模拟的方法,即主动发送时钟,来判断接收数据,但是这么做效果不好。。。

    因此我还是想尽量用硬件SPI,谢谢您!

  • 对于SPI的时序来说,主要的配置就在是时钟频率、字长、时钟的极性和采样的边沿。这个在SPI设备(ADS8371)中会有明确的描述。M4的SPI按照这个去配置就好。

    例如,

    SSIConfigSetExpClk(SSI1_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 2000000, 16);

    SSI_FRF_MOTO_MODE_0是时钟极性和采样边沿,2000000是频率,16是字长。

    接下来就是ADS8371的内部寄存器和配置了,这个按照它的Datasheet去做就行了。