Bauform B. schrieb:
> PB4 ist nach Reset erstmal JNTRST
Hallo,
Ach so. Ich dachte man müsste wenn man JTAG verwenden möchte das extra
einschalten. Nun gut. Ich habe ich AFIO->MAPR die SWJ_CFG Bits so
gesetzt das JTAG abgeschaltet ist aber SWD weiterhin erstmal aktiv
bleibt.
Nun funktioniert der Pin PB4 auch so wie er soll danke dafür schon mal!
Mit dem FLASH Baustein mache ich auch fortschritte. Zumindestens kommen
da jetzt mal Daten raus aber eine Sache verstehe ich noch nicht ganz.
Laut Datenblatt des SPI FLASH muss um die Device ID auszulesen der
Befehl 0x90 gesendet werden und darauf sollen 3 Dummy Adressbytes
folgen. Danach werden dann die Daten rausschoben. Zu mindestens habe ich
das so erstmal verstanden also sieht mein Code dafür wie folgt aus:
1 | GPIOB->BSRR |= GPIO_BSRR_BR4; //FLASH CS LOW
|
2 | writeSPI(SPIP1, 0x90); //Send command first 0x90
|
3 | writeSPI(SPIP1, 0x00); //First dummy address byte
|
4 | writeSPI(SPIP1, 0x00); //Second dummy address byte
|
5 | writeSPI(SPIP1, 0x00); //Third dummy address byte
|
6 | writeSPI(SPIP1, 0x00); //???
|
7 | uint8_t l = readSPI(SPIP1); //Read Manufacturer ID. Should return 0x1F
|
8 | uint8_t h = readSPI(SPIP1); //Read Device ID. Should return 0x47
|
9 | GPIOB->BSRR |= GPIO_BSRR_BS4; //FLASH CS HIGH
|
Ich habe dort eine Zeile kommentiert mit drei ? "???". Wenn ich nur drei
Dummybytes sende wie es das Datenblatt vorsieht das bekomme ich beim
ersten readSPI für l ein Wert von 0xFF und beim zweiten readSPI für h
ein Wert von 0x1F. Sende ich ein viertes Dummybyte bekomme ich beim
ersten read 0x1F und beim zweiten 0x47 so wie es sein soll.
Woran könnte das liegen? Hier sind meine SPI write und read Funktionen
writeSPI:
1 | void writeSPI(SPI_PERIPHERAL spi, uint8_t data) {
|
2 | SPI_TypeDef *spiUnit = SPI1; //SPI1 by default selected
|
3 | if(spi == SPIP2) spiUnit = SPI2; //Switch to SPI2 if requested
|
4 |
|
5 | while((spiUnit->SR & SPI_SR_BSY)); //Wait until SPI Bus is not longer busy
|
6 | spiUnit->DR = data; //Load data into shift register
|
7 | while(!(spiUnit->SR & SPI_SR_TXE)); //Wait until data has been transmitted
|
8 | (void)spiUnit->DR; //Discharge received byte
|
9 |
|
10 | }
|
readSPI:
1 | uint8_t readSPI(SPI_PERIPHERAL spi) {
|
2 | SPI_TypeDef *spiUnit = SPI1; //SPI1 by default selected
|
3 | if(spi == SPIP2) spiUnit = SPI2; //Switch to SPI2 if requested
|
4 |
|
5 | while((spiUnit->SR & SPI_SR_BSY)); //Wait until SPI Bus is not longer busy
|
6 | spiUnit->DR = 0; //Send a dummy byte
|
7 | while(!(spiUnit->SR & SPI_SR_RXNE)); //Wait until data has been loaded in the RX buffer
|
8 | return spiUnit->DR; //Load data from rx buffer and return it
|
9 | }
|
Muss ich daran noch was ändern damit es passt?
Mfg