[elektro] szoftver I2C C-ben

Moczik Gabor pm_levlista at progzmaster.hu
Fri Aug 21 16:01:20 CEST 2009


Moczik Gabor wrote:
> Huszti Andras wrote:
>> Hali!
>>
>> Master vagy slave kell?
> 
> Nekem van master és slave is, de nem mondhatnám hogy egy szép és jól 
> átgondolt megoldás, éppencsak működik.
> 
> Most nem tudom felrakni, beillesztem ide, kb. 10k az egész

Jah, a használati utasítás. Elég specifikus egyébként, azért írtam hogy 
nem teljesen átgondolt univerzális megoldás, két proci közötti egyszerű 
adatcserére használom csak, pl. EEPROM-ot nem próbáltam kezelni vele, 
valószínűleg kéne még ez-az...

Master:
#define XTAL          40000000           /* kvarcfreki Hz-ben */
#define I2C_BAUD      100000             /* i2c busz freki Hz-ben */
#define I2C_BRG       XTAL/I2C_BAUD/4-1

i2c_init(I2C_MASTER,I2C_LOW_PRIORITY, eszköz_cím );
i2c_set_master_brg(I2C_BRG);

1 byte Küldése:
     if (i2c_sendbyte( cél_eszköz_cím , byte )!=I2CR_ACK)) {
         // sikertelen
     }

1 byte küldés és erre az 1 byte-os válasz olvasása:
     if (i2c_readbyte(cél_eszköz_cím, byte)==I2CR_ACK) {
        j=i2c_databuf;
        // ...
     }



Slave:
i2c_init(I2C_MULTIMASTER,I2C_HIGH_PRIORITY, eszköz_cím );

(I2C_MULTIMASTER helyett I2C_SLAVE is jó, ugyanaz, a multimaster mód 
nincs kész)


A fogadás interruptban működik, ezt kell a megfelelő ISR rutinba tenni:
     if ((SSPIE && SSPIF) || (BCLIF && BCLIE)) {
         i2c_isr();
         if (i2c_state==I2CS_DATA_RECEIVED) {
             x = i2c_slave_rx();
             i2c_release_bus();

             // x-ben az adat...

         } else if (i2c_state==I2CS_DATA_REQUEST) {
             i2c_slave_tx( valami_adat );
         }
     }



More information about the Elektro mailing list