2016-12-31 01:06 AM
Hello
I have connected two uc through SPI .
My target is to send data with DAM+CRC.
one of them is slave stm32f030 and the other one is stm32f429.
I'm using cubeMX for confige spi and dma registers .
Here is slave config:
* SPI1 init function */
static void MX_SPI1_Init(void){hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_SLAVE; hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY; hspi1.Init.DataSize = SPI_DATASIZE_16BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_ENABLE; hspi1.Init.CRCPolynomial = 50835; hspi1.Init.CRCLength = SPI_CRC_LENGTH_16BIT; hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); }}
And here is master config:
/* SPI4 init function */
static void MX_SPI4_Init(void){hspi4.Instance = SPI4;
hspi4.Init.Mode = SPI_MODE_MASTER; hspi4.Init.Direction = SPI_DIRECTION_2LINES; hspi4.Init.DataSize = SPI_DATASIZE_16BIT; hspi4.Init.CLKPolarity = SPI_POLARITY_LOW; hspi4.Init.CLKPhase = SPI_PHASE_1EDGE; hspi4.Init.NSS = SPI_NSS_SOFT; hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi4.Init.TIMode = SPI_TIMODE_DISABLE; hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_ENABLE; hspi4.Init.CRCPolynomial = 50835; if (HAL_SPI_Init(&hspi4) != HAL_OK) { Error_Handler(); }}
I use Hal lib to send data :
HAL_SPI_Transmit_DMA(&hspi4,ptr,1);
and call this function in receive side ;
HAL_SPI_Receive_DMA(&hspi1,ptr,1);
data is received as i expected
but i have changed CRC POLYNOMIAL in master side for test crc error in slave side .
but I havn't got any error .
I have checked data transmission by oscilloscope CRC is attached at the end of the data .
when i set breakpoint in DMA receive complete the 'SPI Rx CRC register' was 0 !
and the CRC ERROR bit in status was 0!
i guess the problem is in slave side but i can't find the problem .
I would appreciate all help.
2016-01-01 01:45 AM
Thanks Clive
'
Some how I suspect you have to transmit/receive more than one byte,'
yes you are right :
slave :
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
master :
hspi4.Init.DataSize = SPI_DATASIZE_16BIT;
'What polynomial do you think you are implementing here? For it to work you need specific feed back terms, you can't just use any number in the 16-bit range.'
as i see data sheet and errata the only limitation is that polynomial must be odd and of course 16 bits range .
2016-01-01 05:39 AM
Is there any kind of sample code for Spi with crc enable and Dma data transfer .
2016-01-01 07:53 AM
To see the CRC on the receiving end you'd need to specify a length that included the data + crc bytes or words. If you reset the CRC first, passing the correct one through will result in the remainder being zero, and peripheral flagging it as correct. Seeing the data would allow you to confirm the results manually.
On the transmitting side you need to send the data first, then switch to sending the CRC bytes/words to have them clock over the wire. There would need to be two transactions, only the data portion using DMA
I don't have HAL examples for this.
2016-12-31 08:51 AM
Some how I suspect you have to transmit/receive more than one byte, and manage/effect the transition between sending data and sending CRC bytes.
What polynomial do you think you are implementing here? For it to work you need specific feed back terms, you can't just use any number in the 16-bit range.
2017-01-02 02:43 AM
'
To see the CRC on the receiving end you'd need to specify a length that included the data + crc bytes or words.'
i have read this on user manual :
'In receive only mode, the DMA reception channel counter should contain only the amount of
data transferred, excluding the CRC calculation. Then based on the complete transfer from DMA, all the CRC values must be read back by software from FIFO as it works as a single buffer in this mode.'i don't understand this part :
'
Then based on the complete transfer from
DMA, all the CRC values must be read back by software from FIFO as it works as a single
buffer in this mode.''
'On the transmitting side you need to send the data first, then switch to sending the CRC bytes/words to have them clock over the wire. There would need to be two transactions, only the data portion using DMA'
I see data+CRC by oscilloscope master send data correct .