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/28 04:18] Radovan Juráň [Postup práce] |
2018:si470x-rds [2019/01/28 08:32] (aktuální) Radovan Juráň |
||
---|---|---|---|
Řádek 65: | Řádek 65: | ||
Č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í. | Č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. Vhodnějším se zdál být po několikadenním experimentování //LL I2C Generic Driver//, tedy 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. | + | 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. |