I have a problem with my LM4F120XL. I need to connect it with IMU sensor LSM9DS0 via SPI.
I think that problem is with Chip Select.
Only several first reads are correct. Then I get 255. Quantity of correct reads depends of clock or bitRate (it varies from ~3 to 8) :
SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet() , SSI_FRF_MOTO_MODE_1, SSI_MODE_MASTER, 1000000, 8); ).
I have checked all SSI_FRF_MOTO_MODES - problem still exists.
I think the problem is with Chip Select lines
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6, 0x00); //select device
When I am not toggling CS pin, but instead set it low permanently in initialization, I've got correct reads.
Thanks for help in advance!
void SPIInit() { SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ); SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); GPIOPinConfigure(GPIO_PA2_SSI0CLK); GPIOPinConfigure(GPIO_PA3_SSI0FSS); GPIOPinConfigure(GPIO_PA4_SSI0RX); GPIOPinConfigure(GPIO_PA5_SSI0TX); GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2); SSIClockSourceSet(SSI0_BASE, SSI_CLOCK_SYSTEM); SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet()/1 , SSI_FRF_MOTO_MODE_1, SSI_MODE_MASTER, 1000000, 8); //cs pins SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_3); GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_3, 0xFF); SSIEnable(SSI0_BASE); //get rid of old data in fifo unsigned long junk; GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6, 0x00); //select device do { SSIDataPut(SSI0_BASE, 143); } while(SSIDataGetNonBlocking(SSI0_BASE, &junk)); GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6, 0xff); //deselect device } int SPI_x() { SysCtlDelay(1000); unsigned long who_am_i_value; GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6, 0x00); //start comunication SSIDataPut(SSI0_BASE, 143); SSIDataGet(SSI0_BASE, &who_am_i_value); SysCtlDelay(10000); GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6, 0xff); //staph comunication return who_am_i_value; }