I'm not that much into assemler, so I try to reuse existing asm-code as i2c-driver. I've found original Philips code for that. I try now to link it with c-code but get always linker warnings. Any help appreciated!
NAME . . . . . . . . . USAGE MODULE NAMES -------------------------------------------- ?C_START . . . . . . . CODE; ** L51 GENERATED ** ?C_STARTUP ?C_STARTUP . . . . . . CODE; ?C_STARTUP ASMS ?IIC_TEST_DEVICE . . . CODE; IIC_DRIVER ?IIC_TEST_DEVICE?BYTE. DATA; IIC_DRIVER ?INIT_IIC?BYTE . . . . DATA; IIC_DRIVER ?_IIC_WRITE_SUB?BYTE . ILLEGAL ** UNRESOLVED ** ASMS IIC_ERROR. . . . . . . BIT; IIC_DRIVER MAIN . . . . . . . . . CODE; ASMS _IIC_WRITE_SUB . . . . ILLEGAL ** UNRESOLVED ** ASMS _INIT_IIC. . . . . . . CODE; IIC_DRIVER ASMS *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: _IIC_WRITE_SUB MODULE: asms.obj (ASMS) *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: ?_IIC_WRITE_SUB?BYTE MODULE: asms.obj (ASMS) *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: ?_IIC_WRITE_SUB?BYTE MODULE: asms.obj (ASMS) ADDRESS: 0277H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _IIC_WRITE_SUB MODULE: asms.obj (ASMS) ADDRESS: 027FH
#include <REG552.H> #include "iic.h" #define myIICaddr 0x55 // my own i2c slave address /*------------------------------------------------ MAIN C Function ------------------------------------------------*/ void main (void) { unsigned char reg = 0; // Init routines Init_IIC(myIICaddr); // set control-register: stop counting, enable alarm reg = 0xC4; if(IIC_Write_Sub(RTC_ADDRESS, 1, , 0x00) != I2C_OK) { // error } while (1) { ; } }
$LIST $REGISTERBANK (0,1) $NOSYMBOLS $PAGEWIDTH (130) NAME IIC_DRIVER ; ; Includes: EQREG652.ASM ; $NOLIST $INCLUDE (EQREG652.ASM) $LIST ; ; Public labels defined in this Module: ; ************************************* public ?IIC_Test_Device public ?IIC_Test_Device?BYTE public _Init_IIC public ?Init_IIC?BYTE ; $EJECT ; ...snipp... ?BI?IICBit Segment Bit Rseg ?BI?IICBit ; public IIC_Error IIC_Error: dbit 1 ; IIC Error Bit ; ?BA?IICBitAdr Segment Data BitAddressable Rseg ?BA?IICBitAdr ; IICCntrl: ds 1 ; Bit Addressable IIC Control Register ; ?DT?IICPar Segment Data Rseg ?DT?IICPar ?IIC_Test_Device?BYTE: ?IIC_Write?BYTE: ?Init_IIC?BYTE: ; SlaveAddress: ds 1 ; Slave Address Include R/W DataCount1: ds 1 ; Block 1 Count DataIndex1: ds 1 ; Block 1 Transfer Buffer Address SubAddress: ds 1 ; Sub Address ( If Any ) DataCount2: ds 1 ; Block 2 Count DataIndex2: ds 1 ; Block 2 Transfer Buffer Address ; $EJECT ; $EJECT IICCode Segment Code InBlock Rseg IICCode ; ...snipp... ***************************************************************** ; * Init_IIC: * ; * PROCEDURE ( OwnSlaveAddress ) ; * ; * DECLARE OwnSlaveAddress BYTE ; * ; * * ; * Initialises the IIC SIO1 data, sets the Own Slave Address * ; * * ; * NOTE: This procedure must be called * ; * after power on before use of any other IIC procedure * ; ***************************************************************** _Init_IIC: mov s1adr,SlaveAddress ; Setup Own Slave Address mov s1con,#NSTA_NSTO_AA ; Assert Acknowledge on Slave Address mov IICCntrl,#0 ; Initialise Control / Status Register setb es1 ; Enable SIO1 Interrupt