Forum: Mikrocontroller und Digitale Elektronik STM32L-Discovery mit LM74


von Stefan (Gast)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.