2013-02-04 08:30 AM
Hi all,
I trying to use the SPI and I am using uVision Keil. The clock appear with a latency that I can take off by removingwhile (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
But when I do that I read wrong the data. The 3 last bytes is what I have to read from ADS1 The first byte is the command for read the conversion (ADC). Here's the code:/* SPI1 configuration ------------------------------------------------------*/
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE); /* Enable SPI1 */
SPI_I2S_SendData(SPI1, 0x01); /* Send SPI1 data (LEITURA ADS1241)*/
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
SPI_I2S_ReceiveData(SPI1);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0){} /* Espera conversão*/
while (TxIdx < 3){
SPI_I2S_SendData(SPI1, 0x00); /* Send SPI1 data */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
SPI1_Buffer_Rx[TxIdx] = SPI_I2S_ReceiveData(SPI1);
TxIdx++;
}
TxIdx=0;
And here's the latency. If I use the SPI_BaudRatePrescaler with 128 the latency go away. But its too slow.
I hope somebody can help me cuz I really need this done and I have no ideia what is going on.
2013-02-04 08:37 AM
Perhaps if you want it to sustain a stream you need to send bytes when TXE is set, and read when RXNE is set, instead of serializing the operation so it sequences in the least efficient manner?
2013-02-04 09:15 AM
Thanks for the answer Clive.
What do you mean with''instead of serializing the operation so it sequences in the least efficient manner?'' I am sending a byte when RXNE is set. or not? I put the TXE nothing changes.while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, 0x01); /* Send SPI1 data (LEITURA ADS1241)*/
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
SPI_I2S_ReceiveData(SPI1);
// DelayUs(1);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0){} /* Espera conversão*/
while (TxIdx < 3){
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, 0x00); /* Send SPI1 data */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
SPI1_Buffer_Rx[TxIdx] = SPI_I2S_ReceiveData(SPI1);
TxIdx++;
}
2013-02-04 09:50 AM
Serializing, ie doing ONE thing at a time and precluding advancement to the next state until the perceived completion of the current state, ignoring the fact that there is in fact a buffer, and the operations are not mutually exclusive.
i = 0;
j = 0;
while(j < 4)
{
if ((SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) != RESET) && (i < 4))
SPI_I2S_SendData(SPI1, TxData[i++]);
if (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) != RESET)
RxData[j++] = SPI_I2S_ReceiveData(SPI1);
}
2013-02-04 11:20 AM
Thank you, it worked.
Sorry for the ignorance and a beginner in SPI e STM32.Bye