K
kerden
Guest
to byl můj první písemné I2C pro pic,
tam musí být něco špatného, může některý zjistit, kde jsem odešel špatně.Nějakou radu by opravdu ocenípic16f877a Master a pcf8563 slave I2C fosc = 400KHZ.OSC = 8MHz
PCF8563 číst příkazem 0xA3, napište příkaz 0xA2;
/************************************************* ****************/
void i2c_int ()
(
SSPCON = 0x28, / /
enable I2C mistr
SSPSTAT = 0x00;
SSPADD = 0x04, / / 400kHZ, 8MHz
SSPCON2 = 0x00;
SSPIF = 0; / / jasné přerušíte bit
)
/************************************************* ******************
************************************************** *******************/
neplatný ACK ()
(
ACKDT = 0; / /
ACKEN = 1, / /
/************************************************* *****************/
void uznána ()
(
ACKDT = 1, / /
ACKEN = 1, / /
)
/************************************************* *****************/
void wait_i2c ()
(
while (SSPIF == 0);
SSPIF = 0;
)
/************************************************* *******************
read_control (pcf8563 pořadí) read_count (číst byte počítat) read_buff (čtení, na které array)
************************************************** *******************/
bit i2c_read (uchar read_control, uchar read_count, uchar * read_buff)
(
uchar i;
uchar j;
SEN = 1, / / start
u (j = 0x02; - j
<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Wink" border="0" />
continue; / / zpoždění pro úspěšný start
dělat
(
RSEN = 1;
) while (SSPIF == 0);
SSPIF = 0;
SSPBUF = 0xA2; / / poslat pcf8563 napsat příkaz
wait_i2c ();
if (ACKSTAT)
return ERROR; / / ne ACK návrat
SSPBUF = read_control; / / poslat PCF8563 pořadí
wait_i2c ();
if (ACKSTAT)
return ERROR;
PEN = 1, / / stop
wait_i2c ();
RCEN = 1, / / restart
wait_i2c ();
SSPBUF = 0XA3; / / poslat číst příkazem
wait_i2c ();
if (ACKSTAT)
return ERROR;
PEN = 1, / / stop
wait_i2c ();
for (i = 0; i <read_count; i )// dostávat za read_count na read_buff
(
RCEN = 1, / / začít dostávat
wait_i2c ();
read_buff = SSPBUF; / / nahrát data
if (i! = read_count-1) / / pošle ACK, ale v poslední poslat uznána
(
ACK ();
wait_i2c ();
)
)
Uznána (); / / poslední dostávat NEJSOU ACK
wait_i2c ();
PEN = 1, / / stop
wait_i2c ();
)myslíte, že jste!
tam musí být něco špatného, může některý zjistit, kde jsem odešel špatně.Nějakou radu by opravdu ocenípic16f877a Master a pcf8563 slave I2C fosc = 400KHZ.OSC = 8MHz
PCF8563 číst příkazem 0xA3, napište příkaz 0xA2;
/************************************************* ****************/
void i2c_int ()
(
SSPCON = 0x28, / /
enable I2C mistr
SSPSTAT = 0x00;
SSPADD = 0x04, / / 400kHZ, 8MHz
SSPCON2 = 0x00;
SSPIF = 0; / / jasné přerušíte bit
)
/************************************************* ******************
************************************************** *******************/
neplatný ACK ()
(
ACKDT = 0; / /
ACKEN = 1, / /
/************************************************* *****************/
void uznána ()
(
ACKDT = 1, / /
ACKEN = 1, / /
)
/************************************************* *****************/
void wait_i2c ()
(
while (SSPIF == 0);
SSPIF = 0;
)
/************************************************* *******************
read_control (pcf8563 pořadí) read_count (číst byte počítat) read_buff (čtení, na které array)
************************************************** *******************/
bit i2c_read (uchar read_control, uchar read_count, uchar * read_buff)
(
uchar i;
uchar j;
SEN = 1, / / start
u (j = 0x02; - j
<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Wink" border="0" />
continue; / / zpoždění pro úspěšný start
dělat
(
RSEN = 1;
) while (SSPIF == 0);
SSPIF = 0;
SSPBUF = 0xA2; / / poslat pcf8563 napsat příkaz
wait_i2c ();
if (ACKSTAT)
return ERROR; / / ne ACK návrat
SSPBUF = read_control; / / poslat PCF8563 pořadí
wait_i2c ();
if (ACKSTAT)
return ERROR;
PEN = 1, / / stop
wait_i2c ();
RCEN = 1, / / restart
wait_i2c ();
SSPBUF = 0XA3; / / poslat číst příkazem
wait_i2c ();
if (ACKSTAT)
return ERROR;
PEN = 1, / / stop
wait_i2c ();
for (i = 0; i <read_count; i )// dostávat za read_count na read_buff
(
RCEN = 1, / / začít dostávat
wait_i2c ();
read_buff = SSPBUF; / / nahrát data
if (i! = read_count-1) / / pošle ACK, ale v poslední poslat uznána
(
ACK ();
wait_i2c ();
)
)
Uznána (); / / poslední dostávat NEJSOU ACK
wait_i2c ();
PEN = 1, / / stop
wait_i2c ();
)myslíte, že jste!