/var/www/restricted/ssh/stm32/www/stm32circle/ STM CircleOS forum / STM32 SPI

Username:     
Password:     
             

Forum

# 1   2012-12-24 07:26:02 STM32 SPI

pranathi1091
New member
Registered: 2012-11-12
Posts: 2

STM32 SPI

Hello ALL,

I am using stm32f2xxx.
I am programing An accelerometer which is interfaced via SPI. The problem i m facing is the clock is not always continous. My HSEValue is 8Mhz.
When i get the clcok properly i could see RXNE flag and TXE flag set and it receives valid data. But when i dont get the clock properly i see only TXE flag set.
Below is my init, read and write codes

void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA ,ENABLE);

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;

_InitStructure.GPIO_Pin=SPI1_SCK_PIN;
GPIO_Init(SPI1_GPIO_PORT,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=SPI1_MOSI_PIN;
GPIO_Init(SPI1_GPIO_PORT,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=SPI1_MISO_PIN;
GPIO_Init(SPI1_GPIO_PORT,&GPIO_InitStructure);

GPIO_PinAFConfig(GPIOA,SPI1_SCK_SOURCE,GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA,SPI1_MOSI_SOURCE,GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA,SPI1_MISO_SOURCE,GPIO_AF_SPI1);

/*Configure  CS pin in output pushpull mode*/
  GPIO_InitStructure.GPIO_Pin = SPI1_CS_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  GPIO_Init(SPI1_GPIO_PORT, &GPIO_InitStructure);
}



void SPIConfiguration(void)
{

unsigned char ucdummy;
static char ucindex = 20;

unsigned char rxbuf[20];

void SPI_Config()
{
SPI_InitTypeDef SPI_InitStructure;

RCC_APB2PeriphClockCmd (RCC_APB2Periph_SPI1, ENABLE);

/*SPI initializations*/
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_High;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_2;
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
//SPI_InitStructure.SPI_CRCPolynomial=7;
SPI_InitStructure.SPI_CRCPolynomial=0;

SPI_Init(SPI1,&SPI_InitStructure);
SPI_SSOutputCmd(SPI1,ENABLE);

SPI_Cmd(SPI1,ENABLE);
}



uint8_t SPIXLWriteData(uint8_t Add, uint16_t Data)
{
uint32_t TimeOut;

while ((SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY)))
{
if (TimeOut--==0)
{
return SPI_ERROR;
}
}
CS_LOW();
SPI_I2S_SendData(SPI1, ADXL345_W|Add);         
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);         
ClrRcvBuf();       
         
SPI_I2S_SendData(SPI1, Data);       
ClrRcvBuf();       
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);         
CS_HIGH();

return 1;
}




uint8_t SPIReadData(uint8_t RegisterAddress, uint8_t NoOfRgisters)
{
uint32_t TimeOut;
uint16_t RxBuffer;
/* Select Slave*/
CS_LOW();
/*Make sure the bus is not busy*/
while ((SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY)))
{
if (TimeOut--==0)
{
return SPI_TIMEOUT_ERROR;
}
}
//RxBuffer = SPI_I2S_ReceiveData(SPI1);
SPI_I2S_SendData(SPI1, XL345_R|RegisterAddress);

ClrRcvBuf();
RxBuffer=SPI_I2S_ReceiveData(SPI1);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);       
//dummy byte*/         
SPI_I2S_SendData(SPI1, 0x00);                       
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);      the   
RxBuffer = SPI_I2S_ReceiveData(SPI1);       
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) != SET);       
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);         
     
         
CS_HIGH();

return  RxBuffer;
}



void SPIXLReadSequence(uint8_t reg,uint8_t count)
{         
uint8_t i = 0;
         
CS_LOW();               
SPI_I2S_SendData(SPI1, ADXL345_R | ADXL345_MB | reg);               
ClrRcvBuf();             
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);                       
SPI_I2S_SendData(SPI1, 0xFF);                 
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);                 
data[i]= SPI_I2S_ReceiveData(SPI1);                                 
i++;       
  }       
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);         
CS_HIGH();

}
Could anyone help in resolving this issues

Thanks

Offline

 

# 2   2013-02-14 12:57:25 STM32 SPI

pascal697
Member
Registered: 2011-03-23
Posts: 16

Re: STM32 SPI

If you are in SPI master mode then the clock is up to the STM32 to generate.
what do you call " when i dont get the clock properly i see only TXE flag set. " ?

Offline

 

Board footer