Register lesen über SPI mit einem STM32F103 Microcontroller

Zum lesen eines Registers aus einem Peripheriegerät, in meinem Fall ein ADS7870, über SPI muss man zunächst die Registeradresse zusammen mit einem Bit, das anzeigt das gelesen werden soll, über den Bus senden. Dann sollte man den Registerinhalt als Antwort erhalten. Diese Antwort blieb bei meinen Versuchen mit dem STM32F103 Microcontroller jedoch zunächst aus. Auf dem Oszilloskop fiel auf, dass Bustakt direkt nach dem Senden ausgeschaltet wurde. Beheben konnte ich das Problem in dem ich zum Empfangen des Registerinhaltes zunächst noch 0×00 als Dummybyte sende, da der Bus auf Fullduplex Mode konfiguriert ist und somit immer gleichzeitig ein Byte sendet und empfängt.

Der Code zum lesen aus einem Registers des ADS7870 sieht also folgendermaßen aus (die Hardware wird mit Hilfe der libopencm3 abstrahiert):

u8 ads7870_regRead(u8 reg) {
  u8 data;
  // assert chip select
  gpio_clear(GPIO_ADS7870_CS, GPIO_ADS7870_CS_PIN);
  // send instruction byte
  spi_write(ADS7870_SPI_PIN, ADS7870_REG_READ | reg);
  // Read the answer as dummyread to clear the DR register.
  data = spi_read(ADS7870_SPI_PIN);
  // send dummy byte to hold clock enabled
  spi_write(ADS7870_SPI_PIN, 0x00);
  // read data
  data = spi_read(ADS7870_SPI_PIN);
  //wait for transmit finished
  while (!(SPI_SR(ADS7870_SPI_PIN) & SPI_SR_TXE));
  while ((SPI_SR(ADS7870_SPI_PIN) & SPI_SR_BSY));
  // release chip select
  gpio_set(GPIO_ADS7870_CS, GPIO_ADS7870_CS_PIN);
  // return data
  return data;
}

Under Construction

Hier entsteht die Webpräsenz von Tobias Groll.