cancel
Showing results for 
Search instead for 
Did you mean: 

SPI change polarity on the fly

michelemancini2
Associate III
Posted on August 22, 2012 at 18:30

Hi, I want change polarity on the fly example

When I setting the SPI master, I setting ''SPI_CPOL_Low'' trasmit the 16 bit data, and work!

But I need recive another 16bit data with polarity inverse ''SPI_CPOL_Hight''

The protocolo is this: (ADF7021 ''Serial Interface Readback Timing Diagram'') Send screen of datasheet:

Send 32bit + 1bit clock + 16 bit clock with inverse polarity

Send 32bit = Ok

but How to send in the fly 1 bit clock and inverse polarity on the fly?

  /* SPI configuration -------------------------------------------------------*/

  SPI_I2S_DeInit(SPI1);

  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

  SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;

  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_InitStructure.SPI_CRCPolynomial = 7;

  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

  SPI_Init(SPI1, &SPI_InitStructure);

  /* Enable the SPI peripheral */

  SPI_Cmd(SPI1, ENABLE);

0690X00000602lmQAA.jpg

2 REPLIES 2
michelemancini2
Associate III
Posted on August 22, 2012 at 19:51

I try in this mode but I have a problem:

This code:

  //send 32bit

  SPI_I2S_SendData16(SPI1, 0xAAAA);

   while(!(SPI1->SR & SPI_I2S_FLAG_TXE));  //wait is busy

  SPI_I2S_SendData16(SPI1, 0xAAAA);

   while(!(SPI1->SR & SPI_I2S_FLAG_TXE));  //wait is busy

 

  //change polarity

  SPI1->CR1 = SPI1->CR1 & ~(1<<6); //SPE = 0

  SPI1->CR1 = SPI1->CR1 | (1<<1); //CPOL = 1

  SPI1->CR1 = SPI1->CR1 | (1<<6); //SPE = 1

   //send 16nit

  SPI_I2S_SendData16(SPI1, 0xAAAA);

  while(!(SPI1_TX_busy));

  //restore polarity

  SPI1->CR1 = SPI1->CR1 & ~(1<<6); //SPE = 0

  SPI1->CR1 = SPI1->CR1 & ~(1<<1); //CPOL = 0

  SPI1->CR1 = SPI1->CR1 | (1<<6); //SPE = 1

    

The result are:

The 32bit send perfect, but when the change polarity not change! change only the first bit and the rest of bit the phase is equal of first trasmission:

First Send 32 bit:

0690X00000602lwQAA.jpg

change phase, and this result: (one bit change fase the resdt of bis no change)

0690X00000602lxQAA.jpg

 

Posted on August 23, 2012 at 00:22

TXE is no good for telling when TX is complete, it indicates the holding register is empty, and will assert just before the first bit leaves, not when the last one does. RXNE would be a better flag.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..