Gast
#481707
Hei Leute,
ich habe in C ein Problem mit einer Bibliothek/Funktion. Ich will mit
meinem uC mit dem I2C-Bus kommunizieren. Ich verwende dafuer aus der
Bibliothek vom Hersteller die Standart Funktion i2c_init(), um die pins
zu waehlen usw. Dabei funktioniert diese Initalisierungfunktion aber
nicht. In die Register wird nicht das geschrieben was in der Bibliothek
steht.
Die Funktion i2c_init() taucht komischerweise in der Bib aber 2x auf!!?
Mit verschiedenem Inhalt(siehe //??????????????? im Codeauszug unten).
Habe sowas noch nie gesehn. Werden wenn ich nun in der Hauptroutine
i2c_init() aufrufe nun beide Funktionsteile ausgefuehrt oder muss ich da
was beachten. Bei der "zweiten" Funktion steht noch als Erlaeuterung was
mit SYNTAX: int i2c_init(); was mich ziemlich verwirrt, da die
dazugehoerige Fkt. void ist.
Kann vielleicht jemand Licht ins Dunkel bringen.
Vielen Dank.
Gruss Thorsten
/*** BeginHeader
i2c_init,i2c_SCL_H,i2c_SCL_L,i2c_SDA_H,i2c_SDA_L,i2c_SDA,i2c_SCL */
void i2c_init();
//????????????????????????????????????????????????????????
int i2c_clocks_per_us; //need declaration to prevent error in asm
definition
//below
#define WAIT_5_us asm ld a,(i2c_clocks_per_us) $\
sub 2 $\
ld b,a $\
db 0x10, -2
//*** define C macro ***
// a machine code version of above
#define cWAIT_5_us asm ld a,(i2c_clocks_per_us) $\
sub 3 $\
ld b,a $\
db 0x10,-2
// db
3ah,i2c_clocks_per_us&0ffh,(i2c_clocks_per_us>>8)&0ffh,0d6h,3,47h,10h,-2
// Define these to change basic bit handling
#ifndef i2c_SCL_H()
#define i2c_SCL_H() BitWrPortI(PDDDR,&PDDDRShadow,0,I2CSCLBit)
#define i2c_SCL_L() BitWrPortI(PDDDR,&PDDDRShadow,1,I2CSCLBit)
#define i2c_SDA_H() BitWrPortI(PDDDR,&PDDDRShadow,0,I2CSDABit)
#define i2c_SDA_L() BitWrPortI(PDDDR,&PDDDRShadow,1,I2CSDABit)
#define i2c_SCL() BitRdPortI(PDDR,I2CSCLBit)
#define i2c_SDA() BitRdPortI(PDDR,I2CSDABit)
#endif
/*** EndHeader */
/* START FUNCTION DESCRIPTION
********************************************
i2c_init <I2C.LIB>
SYNTAX: int i2c_init(); //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx
DESCRIPTION: Sets up the SCL and SDA port pins for open-drain output
Also initializes delay constant
Acknowledgement:
This library is programmed for Rabbit Semiconductor by
KENT JOHANSEN
ANAKRON / ANAKRON CANADA INC
www.anakron.com
kent@anakron.com
END DESCRIPTION
**********************************************************/
nodebug
void i2c_init()
//?????????????????????????????????????????????????????????
{
// Set the bits to tristate and the output to 0. Toggle using
//tristate reg.
// This function affects the port D transfer transfer clock
// Transfer clock on port D is PCLK/2
WrPortI(PDCR,&PDCRShadow,0);
BitWrPortI(PDFR ,&PDFRShadow ,0,I2CSCLBit);
// Set the bits to normal function
BitWrPortI(PDFR ,&PDFRShadow ,0,I2CSDABit);
BitWrPortI(PDDDR,&PDDDRShadow,0,I2CSCLBit);
// Set the bits to input (=0)
BitWrPortI(PDDDR,&PDDDRShadow,0,I2CSDABit);
BitWrPortI(PDDCR,&PDDCRShadow,1,I2CSCLBit);
// Set the bits to Open Drain
BitWrPortI(PDDCR,&PDDCRShadow,1,I2CSDABit);
BitWrPortI(PDDR ,&PDDRShadow ,0,I2CSCLBit);
// Set the outputs to 0, when outputs
BitWrPortI(PDDR ,&PDDRShadow ,0,I2CSDABit);
i2c_clocks_per_us = (int)(19200L*32*freq_divider/1000000L);
if(i2c_clocks_per_us < 3)
{
i2c_clocks_per_us = 3;
}
}