我想用M4的SPI模块读取外部ADC的数据,但是发现M4的SCLK并没有输出同步时钟。
谢谢!
step by step:
楼主,
要不把代码发来看看吧。
Wind:
回复 step by step:
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οalcd_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ËùÔú¶Ë¿úPHGPIOPinTypeGPIOOutput(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 Ñóê±Îa1mswhile(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ÅÏ¢} }
Michael Sun:
回复 Wind:
没太看明白SSI读取函数里面的数据处理是啥意思,
不过对于SSI来说,需要读取数据时要先发送数据,这样SSI主设备才会产生时钟,发送数据的同时,接收到的数据也会存入buffer,再调用
SSIDataGet就可以把数据读出来。
Wind:
回复 Michael Sun:
感谢您的回复!
可是我想要读取AD的数据,而不想往AD写数据,因此我该发送什么数据呢?
发送数据的时候有时钟输出,那发送数据结束后要获取数据时就没有时钟了呢?
SSI读取函数的数据处理是为了去掉高位不需要的,因为AD只有14位
Wind:
回复 Michael Sun:
您好!
我现在使用的一款ADS8371芯片,这块芯片只有数据输出,没有数据输入,我不知道该怎么用您之前提过的方法?
我使用软件模拟的方法,即主动发送时钟,来判断接收数据,但是这么做效果不好。。。
因此我还是想尽量用硬件SPI,谢谢您!
Michael Sun:
回复 Wind:
对于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去做就行了。