AnsweredAssumed Answered

spi interface stm-32

Question asked by bharath.r on Feb 25, 2015
Latest reply on Mar 2, 2015 by Clive One
hi
I have been trying to interface cc3200 and tdc gp-22,by referring to example code which is written for stm-32 microcontroller.

i cant understand whats happening in this function which i have given below.How the spi interface actually works below,the use of transmission buffer empty check and reciever buffer not empty check.Whats actualy the process goes ,when i compile these code.Pls help!!

i have attached the stm-32 module for reference
http://www.disca.upv.es/aperles/arm_...p___s_p_i.html

The specified code is described as

Function Name: gp22_read_n_bytes

* Parameters: bus_type = (SPI1, SPI2)

*             n_bytes = how many bytes should be read

*             read_opcode = read opcode of the device

*             read_addr = read address of the device

*             fractional_bits = number of fractional bits of read data

* Return: n bytes from the specified read address

* Description: Reads n bytes from an address in GP22
float gp22_read_n_bytes(void *bus_type, uint8_t n_bytes, uint8_t read_opcode,
                   uint8_t read_addr, uint8_t fractional_bits)
{
  uint32_t    Result_read = 0;
  float       Result = 0;
  uint8_t     read_opcode_addr = read_opcode | read_addr;
 
  //.............. Result = n Byte = n x 8 bits......................
  if (bus_type==SPI1 | bus_type==SPI2)
  {
       // Deactivating Reset SPIx
       if (bus_type==SPI1) GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
       if (bus_type==SPI2) GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET);
       
       SPI_I2S_SendData(bus_type, read_opcode_addr);  // READ OPCODE + Address
        
       while (SPI_I2S_GetFlagStatus(bus_type, SPI_I2S_FLAG_TXE)==RESET) {};
  Simple_delay_750ns((void*)10); // important delay (16) at SPI freq.=750kHz
        
       //Compulsory reads to DR and SR to clear OVR,
       //so that next incoming data is saved
       SPI_I2S_ReceiveData(bus_type);                     // To clear OVR
       SPI_I2S_GetFlagStatus(bus_type, SPI_I2S_FLAG_TXE); // To clear OVR
 
         //Reading byte1
         SPI_I2S_SendData(bus_type, 0x00FF);  // DUMMY WRITE
         // Wait until RX buffer is not empty, then read the received data
         while (SPI_I2S_GetFlagStatus(bus_type, SPI_I2S_FLAG_RXNE)==0) {}
         Result_read = SPI_I2S_ReceiveData(bus_type); //  Read
 
       for (int n = 1; n < n_bytes; n++)
       {      
         //Reading byte2 .. byte.n
         SPI_I2S_SendData(bus_type, 0x00FF);  // DUMMY WRITE
         // Wait until RX buffer is not empty, then read the received data
         while (SPI_I2S_GetFlagStatus(bus_type, SPI_I2S_FLAG_RXNE)==0) {}
 
         Result_read = Result_read<<8;
         Result_read |= SPI_I2S_ReceiveData(bus_type); //  Read
       }
 
       // Reset to device SPIx
       if (bus_type==SPI1) GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
       if (bus_type==SPI2) GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_SET);
  }
   
  Result = Result_read / pow(2, fractional_bits);
 
  return Result;
}

Outcomes