Zdravím,
už dlouho se snažím rozchodit korektní čtení na SPI na ARMovém kontroléru TM4C123GH6PZ. Prostředí IAR workbench.
Podle datasheetu bych měl poslat tři bajty obsahující 0x02, 0x00 a následně adresu registru ze kterého chci číst. Podé by mělo následovat poslání něčeho např 0x00 aby měl slave clocky, nyní je možné vyčíst ne vstupním FIFO nějaký balast a následují validní data (poslat 0x00, vyčíst bajt, poslat 0x00, vyčíst vajt, atd). Bohužel mě to čtení trochu nějak blbne, bajty mi to čte ve zvláštním pořadí. Můžete někdo zkusit projít tento kód, jestli je to v pořádku?
Po tomto čtení mám hned v prvním čteném bajtu validní data … tedy někdy, ne vždy .
//INIT
void AOutInit(void)
{
// SSI0 setup - for DAC module
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_3);
GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_2);
SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 100000, 8);
SSIEnable(SSI0_BASE);
// set DAC error inputs
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
GPIOPinTypeGPIOInput(GPIO_PORTH_BASE, DAC_ERR1);
GPIOPinTypeGPIOInput(GPIO_PORTH_BASE, DAC_ERR2);
// set output mode
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, DAC_UI_CH1);
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, DAC_UI_CH2);
}
V této funkci je čtení
void AOutUpdateStatus(void)
{
uint32_t buffer1 [3];
buffer1 [0] = 1;
buffer1 [1] = 2;
buffer1 [2] = 3;
uint16_t reading = 0;
GPIOPinWrite(GPIO_PORTA_BASE, DAC_CH_SS, DAC_CH1_SS_LOW); //Latch low
SSIDataPut(SSI0_BASE, DAC_RD_REG); //send read command .. 0x02
SSIDataPut(SSI0_BASE, 0x00); //send NOP condition
SSIDataPut(SSI0_BASE, DAC_RD_DAC); //desired read address
while(SSIBusy(SSI0_BASE)); //wait till transmit is complete
GPIOPinWrite(GPIO_PORTA_BASE, DAC_CH_SS, AC_CH1_SS_HIGH); //Latch high
vTaskDelay(1 / portTICK_RATE_MS);
GPIOPinWrite(GPIO_PORTA_BASE, DAC_CH_SS, DAC_CH1_SS_LOW); //Latch low
SSIDataPut(SSI0_BASE, 0x00); //transmit providing clock for MISO
SSIDataGet(SSI0_BASE, buffer1 + 0); // first byte from FIFO (nondefined byte - trash)
SSIDataPut(SSI0_BASE, 0x00); //transmit providing clock for MISO
SSIDataGet(SSI0_BASE, buffer1 + 1); // second byte from FIFO (first valid byte)
SSIDataPut(SSI0_BASE, 0x00); //transmit providing clock for MISO
SSIDataGet(SSI0_BASE, buffer1 + 2); / third byte from FIFO (second valid byte)
while(SSIBusy(SSI0_BASE)); //transmit providing clock for MISO
GPIOPinWrite(GPIO_PORTA_BASE, DAC_CH_SS, AC_CH1_SS_HIGH); //Latch high
}