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;
}