FULL-C: serial bus functions

Verze z 26. 6. 2021, 12:22, kterou vytvořil Adamn (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)

FULL-C

Funkce pro práci se sériovými sběrnicemi

Zařízení SDS mají k dispozici jednu nebo více sériových sběrnic, které lze přímo ovládat z FULL-C programu.

Program může použít tyto funkce:

         void SDS_serial_config(unsigned int busID, unsigned int BaudRateCfg, unsigned int DataSizeCfg, unsigned int StopBitsCfg, unsigned int ParityCfg);
         void SDS_serial_writeCH(unsigned int busID, unsigned char writeChar);
         void SDS_serial_write(unsigned int busID, void *ptr, unsigned int len);
 unsigned int SDS_serial_read(unsigned int busID, void *ptr, unsigned int maxlen);


Sériové sběrnice (UART)

Sériová sběrnice umožňuje připojit další prvky a zařízení ke každému SDS. Výhodou je, že data se posílají sériově, což vyžaduje "jen jeden drát" v každém směru.


Každé zařízení SDS má k dispozici následující sériové sběrnice (které jsou dostupné prostřednictvím FULL-C funkcí):

  • COM1 - busID == 1
  • COM3 - pouze prostřednictvím funkcí SDS_TOPB_xxxx()
  • COM6 - busID == 6

Je čistě na vás, jaký HW připojíte ke COM1 a jaký ke COM6.

Výrobek SDS-BIG napevno připojuje RS485 ke sběrnici COM1, přičemž se navíc sám vnitřně stará o přepínaní směru master budiče linky RS485.

COM6 je k dispozici vždy jako nezávislá duplexní sériová linka (UART) s 3V3 CMOS logikou. COM6 je určeno pro připojení komunikačních modulů jako je GSM, LoRa, MBUS a další.


Sběrnice RS485 na SDS-BIG

Zařízení SDS-BIG má specifika pro své použití - musíte přesně sledovat návod zde: SDS BIG: RS485.


Konfigurace

Využijte funkci SDS_serial_config(). Potřebné parametry jsou následující:

  • busID - viz seznam výše, určuje kterou sériovou sběrnici chcete nastavit
  • BaudRateCfg - určuje rychlost sériového přenosu (např. 9600, nebo 115200 bps)
  • DataSizeCfg - určuje kolik datových bitů má jedno slovo přenášené po lince, možnosti jsou 9 nebo 8 (běžně je to 8)
  • StopBitsCfg - určuje kolik stop-bitů má jedno slovo přenášené po lince, možnosti jsou 0, 1 nebo 2 (běžně je to 1)
  • ParityCfg - určuje jaký typ má případný paritní bit v každém slově přenášeném po lince, možnosti jsou 1=odd, 2=even, 0=none (běžně to je 0)


Pozor! 

Pokud je ParityCfg nenulové, musí být DataSizeCfg napevno nastaven na 9. Nastavte to na 9 bez obav, protože data samotné zůstávají stále na osmi bitech, přičemž ten devátý je právě pro paritu. Obvyklá chyba je, že nastavíte ParitCfg nenulově (na 1 nebo 2) ale zapomenete dát DataSizeCfg na 9, a směr vysílání z SDS pak nefunguje !

Informace

Každou sériovou linku (neplatí pro COM3) musíte nejprve, jednou na začátku, před použitím (čtení či zápis) nastavit právě touto funkcí.


Zápis do sériové linky (výstup dat ze SDS)

Využijte funkci SDS_serial_writeCH() pro zápis jednoho znaku, popř. SDS_serial_write() pro zápis více (tj. 'len') znaků.


Čtení ze sériové linky (vstup dat do SDS)

SDS obsahuje vnitřní vyrovnávací buffer, pro případ že by FULL-C program nestíhal číst data tak rychle, jak do SDS po sériové lince přicházejí. Ovšem kapacita tohoto bufferu je omezená.

Využijte funkci SDS_serial_read() pro čtení jednoho nebo více znaků (čte až 'maxlen' znaků do vámi přichystané oblasti na kterou ukazuej 'ptr').


Příklad

Vzorový příklad, který komunikuje po sběrnici COM6 rychlostí 9600bps a využívá EVEN paritu. Tento příklad opakovaně odesílá pět bajtů dat (nějaký příkaz) a pak vypisuje do konzole vše co přijal

unsigned char buf[128];

void main(void)
{

 // 6 -> SETUP COM6
 // 9 -> we have 8bit data word + 1bit parity
 // 1 -> one stop bit
 // 2 -> even parity
 SDS_serial_config(6, 9600, 9, 1, 2);

 // loop for ever
 for (;;)
 {

   printf("TX...\n");

   // send cmd to slave
   SDS_serial_writeCH(6, 0x10);
   SDS_serial_writeCH(6, 0x5b);
   SDS_serial_writeCH(6, 0x00);
   SDS_serial_writeCH(6, 0x5b);
   SDS_serial_writeCH(6, 0x16);

   // waiting for slave
   wait(1000);

   // read all from slave
   for (;;)
   {
     int rd, i;

     // try to read up to 64 bytes
     rd = SDS_serial_read(6, (void *) &buf[0], 64);

     // got anything ?
     if (0 == rd) break;

     // print all we got so far
     for (i = 0; i < rd; i++)
     {
       printf("%02x ", buf[i]);
     }

     printf("\n");

   }

   // wait before repeating
   wait(1000);
 }

}

Příklad

Řada příkladů je k dispozici na našem fóru, např. zde: https://forum.sds.an-d.cz//viewtopic.php?pid=6854#p6854 a další.