Svetelektro.com

Svetelektro.com

Meno:
Heslo:
SVETELEKTRO • Ako na I2C-DMA v stm32duino?

Ako na I2C-DMA v stm32duino?

Sekcia ur─Źen├í pre Arduino nad┼íencov

Moderátor: Moderátori

Re: Ako na I2C-DMA v stm32duino?

Odosla┼ąod lucky62 » 20 Mar 2020, 13:57

Tak som sa dostal ─Ćalej.. polling re┼żim funguje...

Z nepochopite─żn├Żch d├┤vodov je nutn├ę vo funkcii HAL_I2C_Master_Transmit I2C adresu posun├║┼ą o jeden bit do─żava...

A teda sa mus├ş zavola┼ą s t├Żm shiftom (<<1) takto:
K├│d: Vybra┼ą v┼íetko
HAL_I2C_Master_Transmit( &I2C_Handle, (uint16_t)I2C_DAC_ADDR<<1, (uint8_t*)wave8, BUF_SIZE, (uint32_t)1000 )
....m├┤j bazar....

...Nikdy sa nehádaj s blbcom...
lucky62
Obr├ízok pou┼ż├şvate─ża
Zasl├║┼żil├Ż ─Źlen
Zasl├║┼żil├Ż ─Źlen
Pr├şspevky: 1080
Zalo┼żen├Ż: 14.02.2012
Bydlisko: Liptovsk├Ż Mikul├í┼í, SK
Karma: 9

Re: Ako na I2C-DMA v stm32duino?

Odosla┼ąod jirka.jirka. » 20 Mar 2020, 17:06

Ten posun je jasn├Ż.
https://i2c.info/i2c-bus-specification

Ten osm├Ż bit ur─Źuje read or write. :thumbup:

Obrázok
jirka.jirka.
Obr├ízok pou┼ż├şvate─ża
Zasl├║┼żil├Ż ─Źlen
Zasl├║┼żil├Ż ─Źlen
Pr├şspevky: 1213
Zalo┼żen├Ż: 17.10.2008
Bydlisko: Uhersk├ę Hradi┼ít─Ť
Karma: 13

Re: Ako na I2C-DMA v stm32duino?

Odosla┼ąod lucky62 » 20 Mar 2020, 18:09

Toto je jasn├ę.

Nepochopite─żn├ę je, pre─Źo sa s t├Żm mus├ş zapodieva┼ą program├ítor a neurob├ş to t├í "vysoko├║rov┼łov├í" funkcia sama.
Ve─Ć predsa HAL bolo uroben├ę na to, aby sa program├ítor nezapodieval detailami o registroch.
Naviac je cel├ę HAL ve─żmi biedne zdokumentovan├ę.
....m├┤j bazar....

...Nikdy sa nehádaj s blbcom...
lucky62
Obr├ízok pou┼ż├şvate─ża
Zasl├║┼żil├Ż ─Źlen
Zasl├║┼żil├Ż ─Źlen
Pr├şspevky: 1080
Zalo┼żen├Ż: 14.02.2012
Bydlisko: Liptovsk├Ż Mikul├í┼í, SK
Karma: 9

Re: Ako na I2C-DMA v stm32duino?

Odosla┼ąod jirka.jirka. » 20 Mar 2020, 18:31

Nepochopite─żn├ę je, pre─Źo sa s t├Żm mus├ş zapodieva┼ą program├ítor a neurob├ş to t├í "vysoko├║rov┼łov├í" funkcia sama.
Ve─Ć predsa HAL bolo uroben├ę na to, aby sa program├ítor nezapodieval detailami o registroch.
Naviac je cel├ę HAL ve─żmi biedne zdokumentovan├ę.


To je pouze ├║hel pohledu. Kdyby se v┼íechno d─Ťlalo vysoko├║rov┼łov─Ť, co by program├íto┼Öi d─Ťlali? :D Ale ne v├í┼żn─Ť, to ┼że to m├í posunout program├ítor m├í sv├ę v├Żhody. Nemus├ş p┼Öepo─Ź├şt├ív├ít adresu. ;) Ale op─Ťt, pokud ti HAL nevyhovuje, ud─Ťlej si vlastn├ş funkce a naprogramuj to ─Źist─Ť za pomoc├ş registr┼». Je to sice opruz, ale bude┼í p┼Öesn─Ť v─Ťd─Ťt co to d─Ťl├í. A dokumentace HAL. No nezb├Żv├í, ne┼ż se pod├şvat do t├ę funkce a do datasheetu a pod├şvat se, co ta funkce d─Ťl├í.
Stejn─Ť je v tom HAL akor├ít zabalen├ę pln─Ťn├ş registr┼». :thumbup:
jirka.jirka.
Obr├ízok pou┼ż├şvate─ża
Zasl├║┼żil├Ż ─Źlen
Zasl├║┼żil├Ż ─Źlen
Pr├şspevky: 1213
Zalo┼żen├Ż: 17.10.2008
Bydlisko: Uhersk├ę Hradi┼ít─Ť
Karma: 13

Re: Ako na I2C-DMA v stm32duino?

Odosla┼ąod lucky62 » 21 Mar 2020, 12:05

To DMA je neskuto─Źn├Ż z├ípas...

Po spusten├ş prenosu sa I2C aj DMA dostane do stavu BUSY, ale ni─Ź sa neodosiela.

P├ítral som po internete a v┼íade p├ş┼íu, ┼że je potrebn├ę nakonfigurova┼ą aj preru┼íenia (NVIC).
pr├şklady:
https://community.st.com/s/question/0D50X00009XkhQhSAJ/hal-uart-transfer-with-dma-keeps-busy
https://community.st.com/s/question/0D50X00009Xkg8ASAR/i2c-dma-is-busy
https://community.st.com/s/question/0D50X00009XkgtY/dma-uart-with-hal-remain-busy-bug

Av┼íak Reference Manual tvrd├ş:
13.1 DMA introduction
Direct memory access (DMA) is used in order to provide high-speed data transfer between
peripherals and memory as well as memory to memory. Data can be quickly moved by DMA
without any CPU actions
. This keeps CPU resources free for other operations.


V tom tre┼ąom linku chlap modifikoval UART kni┼żnicu, aby to chodilo...

Skuto─Źne to bez preru┼íen├ş nejde?...
....m├┤j bazar....

...Nikdy sa nehádaj s blbcom...
lucky62
Obr├ízok pou┼ż├şvate─ża
Zasl├║┼żil├Ż ─Źlen
Zasl├║┼żil├Ż ─Źlen
Pr├şspevky: 1080
Zalo┼żen├Ż: 14.02.2012
Bydlisko: Liptovsk├Ż Mikul├í┼í, SK
Karma: 9

Re: Ako na I2C-DMA v stm32duino?

Odosla┼ąod lucky62 » 22 Mar 2020, 23:39

Odpovedám si sám... NEJDE!
V tom HAL to proste bez mno┼żstva callback funkci├ş a IRQ rut├şn nejde...

Toto je v├Ż┼łatok z funkcie HAL_I2C_Master_Transmit_DMA - minimum s├║ ┼ítyri podporn├ę funkcie:

K├│d: Vybra┼ą v┼íetko
      /* Set the I2C DMA transfer complete callback */
      hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;

      /* Set the DMA error callback */
      hi2c->hdmatx->XferErrorCallback = I2C_DMAError;

      /* Set the unused DMA callbacks to NULL */
      hi2c->hdmatx->XferHalfCpltCallback = NULL;
      hi2c->hdmatx->XferAbortCallback = NULL;

      /* Enable the DMA channel */
      dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);

      if (dmaxferstatus == HAL_OK)
      {
        /* Enable Acknowledge */
        SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);

        /* Generate Start */
        SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);

        /* Process Unlocked */
        __HAL_UNLOCK(hi2c);

        /* Note : The I2C interrupts must be enabled after unlocking current process
        to avoid the risk of I2C interrupt handle execution before current
        process unlock */

        /* Enable EVT and ERR interrupt */
        __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);

        /* Enable DMA Request */
        SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
      }
....m├┤j bazar....

...Nikdy sa nehádaj s blbcom...
lucky62
Obr├ízok pou┼ż├şvate─ża
Zasl├║┼żil├Ż ─Źlen
Zasl├║┼żil├Ż ─Źlen
Pr├şspevky: 1080
Zalo┼żen├Ż: 14.02.2012
Bydlisko: Liptovsk├Ż Mikul├í┼í, SK
Karma: 9

Re: Ako na I2C-DMA v stm32duino?

Odosla┼ąod lucky62 » 24 Mar 2020, 08:03

Tak som to rozbehal ru─Źne.

po inicializácii I2C a DMA sa prenos zaháji takto:
K├│d: Vybra┼ą v┼íetko
  SET_BIT( I2C1->CR1, I2C_CR1_START );    // generate START condition by setting START bit

  uint64_t time = 0xFFFFFFFF;
  while ( READ_BIT( I2C1->SR1, I2C_SR1_SB ) == 0 ) {   // wait for SB
    time--;
    if ( time == 0 ) {
      Serial.println("SB timeout.");
      return;
    }
  };
  Serial.println("SB detected.");

  WRITE_REG( I2C1->DR, I2C_DAC_ADDR2 );   // write the SHIFTED slave address to DR

  while ( READ_BIT( I2C1->SR1, I2C_SR1_ADDR ) == 0 ) {   // wait for ADDR flag
    time--;
    if ( time == 0 ) {
      Serial.println("ADDR timeout.");
      return;
    }
  };
  Serial.println("ADDR detected.");

  SET_BIT( I2C1->CR2, I2C_CR2_DMAEN );   // enable DMA requests

  READ_REG( I2C1->SR1 );   // Read registers SR1 and SR2
  READ_REG( I2C1->SR2 );   // this will start the DMA tranfer by generating DMA request (setting TxE flag)


─Äalej u┼ż to be┼ż├ş samo - DMA je v re┼żime CIRCULAR, posiela buffer dokola.
Samozrejme treba z ─Źasu na ─Źas skontrolova┼ą stav a o┼íetri┼ą pr├şpadn├ę chybov├ę stavy.
....m├┤j bazar....

...Nikdy sa nehádaj s blbcom...
lucky62
Obr├ízok pou┼ż├şvate─ża
Zasl├║┼żil├Ż ─Źlen
Zasl├║┼żil├Ż ─Źlen
Pr├şspevky: 1080
Zalo┼żen├Ż: 14.02.2012
Bydlisko: Liptovsk├Ż Mikul├í┼í, SK
Karma: 9

Predchádzajúca

Nasp├Ą┼ą na Arduino

Kto je pr├ştomn├Ż

U┼ż├şvatelia prezeraj├║ci si toto f├│rum: ┼Żiadny registrovan├Ż pou┼ż├şvate─ż a 2 host├ş.

Forums ©
Autor str├ínky je Ondrej Z├ívodsk├Ż(zawin), o graficky design sa star├í ─Żubo┼í Fabo(BUFU).

TOPlist

Powered by Copyright © UNITED-NUKE CMS. All Rights Reserved.
─îas potrebn├Ż k spracovaniu str├ínky 0.29 sek├║nd