[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