Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2018:si470x-rds

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

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.
2018/si470x-rds.1548606957.txt.gz · Poslední úprava: 2019/01/27 17:35 autor: Radovan Juráň