STM32L-Discovery mit LM74

Gast #3174065
Lesenswert?

Hallo zusammen,

seit geraumer Zeit versuche ich ein kleines Projekt zu realisieren.
Darin geht es darum, mit dem STM32L-Discovery Board über SPI den 
Temperatursensor LM74 anzusteuern und den Messwert in einer Oberfläche 
über eine RS232 Schnittstelle am PC auszugeben.

Es klappt soweit alles, außer die Ansteuerung des LM74 über SPI.
Das große Problem liegt glaube ich darin, dass der LM74 in den ersten 16 
Takten 2 Dummybytes geschickt bekommen muss, und anschließend für die 
restlichen 16 Takten den Temperaturwert auslesen kann.

Im Internet ist überhaupt nichts dafür zu finden, wenn, dann nur für den 
PIC.
Dort weiß ich auch von Kollegen, dass es klappt.

Kann es tatsächlich sein, dass ich in diesem Fall nicht die fertigen SPI 
Strukturen benutzen kann?
Bisher habe ich es so versucht:

void spi2init(void)
{


  SPI_InitTypeDef SPI_SPI2_InitStructure;



  SPI_SPI2_InitStructure.SPI_Direction = 
SPI_Direction_2Lines_FullDuplex;
  SPI_SPI2_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_SPI2_InitStructure.SPI_DataSize = SPI_DataSize_16b;
  SPI_SPI2_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  SPI_SPI2_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  SPI_SPI2_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_SPI2_InitStructure.SPI_BaudRatePrescaler = 
SPI_BaudRatePrescaler_64;
  SPI_SPI2_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_SPI2_InitStructure.SPI_CRCPolynomial = 0;

  SPI_Init(SPI2, &SPI_SPI2_InitStructure);
  SPI_Cmd(SPI2, ENABLE);

}


dieser Teil in der GPIO_Init....
GPIOSPI2_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;  // 13 = 
SPI2_SCK, 15 = SPI2_MOSI
  GPIOSPI2_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIOSPI2_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIOSPI2_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
  GPIO_Init(GPIOB, &GPIOSPI2_InitStructure);

  GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);

  GPIOSPI2_InitStructure.GPIO_Pin = GPIO_Pin_14;  // 14 = SPI2_MISO
  GPIOSPI2_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIOSPI2_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
  GPIO_Init(GPIOB, &GPIOSPI2_InitStructure);



  GPIOSPI2_InitStructure.GPIO_Pin = GPIO_Pin_12;      // 12= SPI2_CS
  GPIOSPI2_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIOSPI2_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIOSPI2_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
  GPIO_Init(GPIOB, &GPIOSPI2_InitStructure);

  GPIO_WriteBit(GPIOB, GPIO_Pin_12, SET);
....


außerdem setze ich auch den Clock für das SPI2 Register.

in meiner main sieht es dann folgendermaßen aus:

...
while(1)
  {
    uint16_t send_data = 0xFF;
    uint16_t receive_data = 0;
    GPIO_WriteBit(GPIOB, GPIO_Pin_12, RESET); //CS auf Low ziehen
    SPI_I2S_SendData(SPI2, send_data);
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE));

    receive_data = SPI_I2S_ReceiveData(SPI2);
    GPIO_WriteBit(GPIOB, GPIO_Pin_12, SET);   //CS wieder auf high 
setzen
    if(receive_data1 !=0 || receive_data2 !=0)
    {
      i++;
      receive_data = 3;
    }
  }
}
..


so, nun bekomme ich aber nie Daten in mein uint16_t receive_data zurück.
Es bleibt immer auf 0.

Hat irgendjemand einen Ansatz oder eine Lösung, wie ich den LM74 
ansteuern kann?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren