We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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
now I'm completly lost. To what code belongs this header file? Well, see. I've a 80c552 module with different i2c components attached to it. I desperatly try to find a genric driver to read and write to this bus (bytes or block of bytes). I've looked at several places and the best I found was this PL/M thing. This functions covers exactly my need. If someone can point me to a driver that works with my c-code I'll more than happy!!
" To what code belongs this header file?" Read the 1st line of Bob's post - he tells you what it is & where it comes from! Bob's code illustrates Hans-Bernhard's suggestion to use the C51 'alien' keyword. The 'alien' keyword allows C51 to call PL/M functions. The assembler code you are referring to is written to interface to PL/M - as it says in the Application Note.