Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
2018:si470x-rds [2019/01/27 17:35] Radovan Juráň |
2018:si470x-rds [2019/01/28 08:32] (aktuální) Radovan Juráň |
||
---|---|---|---|
Řádek 39: | Řádek 39: | ||
Na základě výše uvedeného článku o grafické knihovně LittlevGL byly úspěšně vyzkoušeny demoverze a benchmarky knihovny. Volně dostupný testovací projekt postačilo stáhnout, doplnit případné chybějící soubory a nahrát úspěšně po přeložení do desky. | Na základě výše uvedeného článku o grafické knihovně LittlevGL byly úspěšně vyzkoušeny demoverze a benchmarky knihovny. Volně dostupný testovací projekt postačilo stáhnout, doplnit případné chybějící soubory a nahrát úspěšně po přeložení do desky. | ||
+ | Zbývalo tedy propojit tyto ověřené dílčí celky v systém. | ||
===== Vývoj ===== | ===== Vývoj ===== | ||
===== Slovo úvodem ===== | ===== Slovo úvodem ===== | ||
- | Projekt si klade za cíl být pružný a modifikovatelný pomocí použitých nástrojů, takže chce využít maximální množství standardních a zdokumentovaných funkcí pro pozdější modifikovatelnost a reprodukovatelnost. Jinými slovy, usnadnit použité principy natolik, že kdyby projekt někdo četl, tak ať nehledá dlouhé týdny jako já. :-) Rovněž by rád přesáhl hranice projektu předmětu MPOA a poskytl jak zkušenosti (inspiraci) k Si4703 tak LittlevGL. Veškerý kód je a bude volně dostupný v repositáři na githubu: [[https://github.com/radjur/Si470x]] | + | Projekt si klade za cíl být pružný a modifikovatelný pomocí použitých nástrojů, takže chce využít maximální množství standardních a zdokumentovaných funkcí pro pozdější modifikovatelnost a reprodukovatelnost. Jinými slovy, usnadnit použité principy natolik, že kdyby projekt někdo četl, tak ať nehledá některé informace dlouho, bude-li začínat on nuly jako já. :-) Rovněž by rád přesáhl hranice projektu předmětu MPOA a poskytl jak zkušenosti (inspiraci) k Si4703 tak LittlevGL. Veškerý kód je a bude volně dostupný v repositáři na githubu: [[https://github.com/radjur/Si470x]] |
===== Postup práce ===== | ===== Postup práce ===== | ||
Řádek 56: | Řádek 57: | ||
Začalo testování periferií, potřebných pro komunikaci. Úspěšně se povedlo otestovat komunikaci po sběrnici I2C, kde nejprve bylo v roli Slave nakonfigurováno Arduino Uno, které přeposílalo přijaté bajty přes UART do počítače, aby bylo možné hned sledovat dění a ověřit, že přenos dat probíhá korektně. Následně se pro ladění využilo jedno z vlastních rozhraní UART vývojového kitu, které pro další testování posloužilo jako pomocný výstup. | Začalo testování periferií, potřebných pro komunikaci. Úspěšně se povedlo otestovat komunikaci po sběrnici I2C, kde nejprve bylo v roli Slave nakonfigurováno Arduino Uno, které přeposílalo přijaté bajty přes UART do počítače, aby bylo možné hned sledovat dění a ověřit, že přenos dat probíhá korektně. Následně se pro ladění využilo jedno z vlastních rozhraní UART vývojového kitu, které pro další testování posloužilo jako pomocný výstup. | ||
- | Vše potřebné bylo připraveno, avšak před samotným přistoupením k vývoji obslužných funkcí pro Si4703 proběhl průzkum již dostupných zdrojů. Protože modul Si4703 je oblíbený v komunitě Arduino, nejrozšířenějším hotovým řešením je Spark Fun Breakout knihovna, [[https://github.com/sparkfun/Si4703_FM_Tuner_Evaluation_Board/tree/V_H1.3_L1.2.0|dostupná z githubu SparkFun]]. Github skýtá také volně dostupné [[https://github.com/LonelyWolf/stm32/tree/master/Si4703|řešení pro STM32F10]]. U obou citovaných zdrojů lze pozorovat obdobný přístup k obsluze, navrhovaný v samotném datasheetu AN230 na straně 12 (odkaz výše), kde se doporučuje doslova ukládání hodnot každého ze 16 registrů lokálně k zjednodušení manipulace s bity v registrech a k redukování počtu čtení a zápisů na sběrnici, k nimž se odkazuje jako ke stínovým registrům ukládaným jako pole 16 slov (2x8 bitů, respektive 2x1 byte). Tyto se vždy načtou, dle potřeby změní, a opět uloží. | + | {{ :2018:p_20190124_215426.jpg?nolink&600 |}} |
- | Čtení a zápis funguje na principu [[https://cs.wikipedia.org/wiki/I%C2%B2C|sběrnice I2C]], avšak má svá specifika. Komunikace probíhá ve tří- nebo dvouvodičovém zapojení, které se volí při zapínání zařízení. | + | Vše potřebné bylo připraveno, avšak před samotným přistoupením k vývoji obslužných funkcí pro Si4703 proběhl **průzkum již hotových aplikací**, a to zejména proto **aby nevznikla jejich kopie**. Protože modul Si4703 je oblíbený v komunitě Arduino, nejrozšířenějším hotovým řešením je Spark Fun Breakout knihovna, [[https://github.com/sparkfun/Si4703_FM_Tuner_Evaluation_Board/tree/V_H1.3_L1.2.0|dostupná z githubu SparkFun]]. Github skýtá také volně dostupné [[https://github.com/LonelyWolf/stm32/tree/master/Si4703|řešení pro STM32F10]]. |
+ | |||
+ | U obou citovaných zdrojů lze pozorovat obdobný přístup k obsluze, navrhovaný v samotném datasheetu AN230 na straně 12 (odkaz výše), kde se doporučuje doslova ukládání hodnot každého ze 16 registrů lokálně k zjednodušení manipulace s bity v registrech a k redukování počtu čtení a zápisů na sběrnici, k nimž se odkazuje jako ke stínovým registrům ukládaným jako pole 16 slov (2x8 bitů, respektive 2x1 byte). Tyto se vždy načtou z Si4703 do kitu (MCU), dle potřeby pozmění, a opět uloží zpět do Si4703. | ||
+ | |||
+ | Čtení a zápis registrů funguje na principu [[https://cs.wikipedia.org/wiki/I%C2%B2C|sběrnice I2C]], avšak má svá specifika. Komunikace probíhá ve tří- nebo dvouvodičovém zapojení, které se volí při zapínání zařízení. Jakmile je nakonfigurováno, může začít čtení/zápis registrů. Je potřeba věnovat pozornost faktu, že čtení probíhá od registru 0x0A a pokračuje přes 0x0F zpět od 0x00 tak, že z 16bitového registru vždy přijde horních 8 bitů a pak dolních 8 bitů vždy v pořadí. | ||
+ | |||
+ | První pokusy o komunikaci probíhaly s využitím //HAL I2C Generic Driver//, který se ukázal méně vhodný pro tyto účely, protože svou abstrakcí odbíhá od požadovaných kroků nutných během komunikace. Byť snaha dodržet kroky z datasheetu vrátila nějaké nenulové byty, jejich interpretace je chybná. | ||
+ | |||
+ | <code c> | ||
+ | uint8_t si4703_registers[32] = ""; | ||
+ | //force zeros at initial state by default, https://stackoverflow.com/questions/18688971/c-char-array-initialization | ||
+ | |||
+ | /* 1. Supply VA and VD. */ | ||
+ | /*2. Supply VIO while keeping the RST pin low. Note that power supplies may be sequenced in any order (steps 1 | ||
+ | and 2 may be reversed).*/ | ||
+ | HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET); | ||
+ | |||
+ | /*3. Configure the proper pins for bus mode selection. See Figure 3, “Powerup, Powerdown, and Reset Flowchart,” | ||
+ | on page 7.*/ | ||
+ | HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET); | ||
+ | HAL_Delay(1); // some delay needed | ||
+ | |||
+ | /*4. Set the RST pin high. The device registers may now be read and written.*/ | ||
+ | HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_SET); | ||
+ | HAL_Delay(1); // some delay needed | ||
+ | |||
+ | /*5. Provide RCLK. If using the internal oscillator option, set the XOSCEN bit. Provide a sufficient delay before | ||
+ | setting the ENABLE bit to ensure that the oscillator has stabilized. The delay will vary depending on the external | ||
+ | oscillator circuit and the ESR of the crystal, and it should include margin to allow for device tolerances. The | ||
+ | recommended minimum delay is no less than 500 ms. A similar delay may be necessary for some external | ||
+ | oscillator circuits. Determine the necessary stabilization time for the clock source in the system. | ||
+ | To experimentally measure the minimum oscillator stabilization time, adjust the delay time between setting the | ||
+ | XOSCEN and ENABLE bits. After powerup, use the Set Property Command described in "5.1.Si4702/03 | ||
+ | Commands (Si4702/03 Rev C or Later Device Only)" on page 31 to read property address 0x0700. If the delay | ||
+ | exceeds the minimum oscillator stabilization time, the property value will read 0x1980 ±20%. If the property | ||
+ | value is above this range, the delay time is too short. The selected delay time should include margin to allow for | ||
+ | device tolerances.*/ | ||
+ | HAL_I2C_MspInit(&hi2c3); //wake up the I2C | ||
+ | HAL_I2C_Master_Receive(&hi2c3, SI4703_ADDRESS, si4703_registers, 32, 100); //read for being able to modify | ||
+ | |||
+ | /*6. Si4703-C19 Errata Solution 2: Set RDSD = 0x0000. Note that this is a writable register.*/ | ||
+ | /*7. Set the ENABLE bit high and the DISABLE bit low to powerup the device.*/ | ||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | Vhodnějším se zdál být po několikadenním experimentování //LL I2C Generic Driver//, t/code>edy low-layer, a to primárně protože umožňuje kontrolovat a ovládat stavy komunikace (START, ACK, STOP apod.) na sběrnici I2C. Jeho využití lze v CubeMX nalézt a zapnout v //Project Manager>Advanced Settings>Driver Selector//. Značná část času byla investována do nastolení korektní komunikace mezi Masterem a Slavem, což se nepodařilo ve stanoveném termínu odladit. |