i want to implement a I2C API(from Beck SC12 microcontroller ) in a 1 wire search C-code(use to search devices on 1 wire bus) sothat that i can use Beck SC12 microcontroller to perform a 1 wire search command.
I tried to implement this I2C API in the search code but my programm this not workout because my programming power is weak
1) see communication diagram on page one under:
http://pdfserv.maxim-ic.com/en/an/AN3684.pdf or search AN3684 in the internet
2) see the 1 wire search C-code from page 12 to 16 under: http://pdfserv.maxim-ic.com/en/an/AN3684.pdf or search AN3684 in the internet.
3)see below for the I2C API decription and my failed 1 wire search program.
further explanation for the I2C API is found under:www.goblack.de.
Expand|Select|Wrap|Line Numbers
- /****
- I2C API DEFINITIONS*************************************** ******************************/
- void I2C_init (void);
- void I2C_release (void);
- void I2C_restart (void);
- unsigned char I2C_scan (unsigned char start_addr, unsigned char end_addr);
- int I2C_transmit_block (unsigned char slave, char far * buffer, int length);
- int I2C_receive_block (unsigned char slave, char far * buffer, int length);
- int I2C_transmit_char (unsigned char slave, char c);
- int I2C_receive_char (unsigned char slave, char * c, unsigned char lastchar);
- void I2C_select_clock_pin(unsigned char pio_no);
- void I2C_select_data_pin(unsigned char pio_no);
- /************************************************** ***********************/
- //#endif /* __I2CAPI_H__*/
- /************************************************** **************************/
- //includes
- //I2C definitions
- /************************************************** **************************/
- #include <stdio.h>
- #include <stdlib.h>
- #include <dos.h>
- #include "declarations.h"
- #include "1wire.h"
- /************************************************** ***********************/
- //Init the I2C Interface
- //I2C bus initialisation
- /************************************************** ***********************/
- uchar program = 0; // program-variable
- uchar ROM[8];
- uchar lastDevice=0;
- uchar LastDeviceFlag, LastFamilyDiscrepancy;
- int LastDiscrepancy;
- uchar deviceAddress;
- uchar resetSearch;
- uchar diir,firsstBit,seccondBit;
- //I2C bus initialisation
- void I2C_init (void)
- {
- union REGS inregs;
- union REGS outregs;
- inregs.h.ah = I2C_INIT;
- int86(I2CINT,&inregs,&outregs);
- }
- /************************************************** ***********************/
- //Release I2C bus
- //I2C bus sends stop condition
- /************************************************** ***********************/
- void I2C_release (void) //
- {
- union REGS inregs;
- union REGS outregs;
- inregs.h.ah = I2C_RELEASE;
- inregs.h.al = 0;
- int86(I2CINT,&inregs,&outregs);
- }
- /************************************************** ***********************/
- //Restart I2C
- //I2C bus sends start condition
- /************************************************** ***********************/
- void I2C_restart (void)
- {
- union REGS inregs;
- union REGS outregs;
- inregs.h.ah = I2C_RESTART;
- inregs.h.al = 0;
- int86(I2CINT,&inregs,&outregs);
- }
- /************************************************** ***********************/
- //Transmit Block
- // I2C bus transmits a number of bytes length from the buffer to DS2482
- //"slave" is the i2c adress of DS2482 ,7bits + 1bit(R/W)
- //transmission ends up with stop condition
- /************************************************** ***********************/
- int I2C_transmit_block (unsigned char slave, char far * buffer, int length)
- {
- union REGS inregs;
- union REGS outregs;
- struct SREGS sregs;
- inregs.h.ah = I2C_TRANS_RECV_BLOCK;
- inregs.h.al = slave & 0xFE;
- inregs.x.cx = length;
- sregs.es = FP_SEG(buffer);
- inregs.x.bx = FP_OFF(buffer);
- int86x(I2CINT,&inregs,&outregs,&sregs);
- if (outregs.x.flags & 0x01)
- {
- return outregs.h.al;
- }
- return 0;
- }
- /************************************************** ***********************/
- //Receive Block
- //I2C bus recieve byte(s) sequentially
- //this is oppsite of transmit_block above!
- /************************************************** ***********************/
- int I2C_receive_block (unsigned char slave, char far * buffer, int length)
- {
- union REGS inregs;
- union REGS outregs;
- struct SREGS sregs;
- inregs.h.ah = I2C_TRANS_RECV_BLOCK;
- inregs.h.al = slave | 0x01;
- inregs.x.cx = length;
- sregs.es = FP_SEG(buffer);
- inregs.x.bx = FP_OFF(buffer);
- int86x(I2CINT,&inregs,&outregs,&sregs);
- if (outregs.x.flags & 0x01)
- {
- return outregs.h.al;
- }
- return 0;
- }
- /************************************************** ***********************/
- //Transmit one character
- //I2C bus transmits a byte from µC to DS2482
- //"slave" is DS2482 adress 7bits + 1 bit(R/W)
- /************************************************** ***********************/
- int I2C_transmit_char (unsigned char slave, char c)
- {
- union REGS inregs;
- union REGS outregs;
- inregs.h.ah = I2C_TRANS_RECV_CHAR;
- inregs.h.al = slave & 0xFE;
- inregs.h.cl = c;
- int86(I2CINT,&inregs,&outregs);
- if (outregs.x.flags & 0x01)
- {
- return (int)outregs.h.al & 0x00FF;
- }
- return 0;
- }
- /************************************************** ***********************/
- //Receive one Character
- //I2C recieve byte(s) from DS2482
- /************************************************** ***********************/
- int I2C_receive_char (unsigned char slave, char * c, unsigned char lastchar)
- {
- union REGS inregs;
- union REGS outregs;
- inregs.h.ah = I2C_TRANS_RECV_CHAR;
- inregs.h.al = slave | 0x01;
- if (lastchar)
- {
- inregs.h.cl = 1; //want more characters
- }
- else
- {
- inregs.h.cl = 0; //only one character
- }
- int86(I2CINT,&inregs,&outregs);
- if (outregs.x.flags & 0x01)
- {
- *c = 0;
- return (int)outregs.h.al & 0x00FF;
- }
- *c = (char)outregs.h.ch;
- return 0;
- }
- /************************************************** ***********************/
- //Select I2C Clock Pin from the µC
- /************************************************** ***********************/
- void I2C_select_clock_pin(unsigned char pio_no)
- {
- union REGS inregs;
- union REGS outregs;
- inregs.h.ah = I2C_SELECT_CLK_PIN;
- inregs.h.al = pio_no;
- int86(I2CINT,&inregs,&outregs);
- }
- /************************************************** ***********************/
- //Select I2C data Pin from the µC
- /************************************************** ***********************/
- void I2C_select_data_pin(unsigned char pio_no)
- {
- union REGS inregs;
- union REGS outregs;
- inregs.h.ah = I2C_SELECT_DATA_PIN;
- inregs.h.al = pio_no;
- int86(I2CINT,&inregs,&outregs);
- }
- void writeByte(unsigned char slave,unsigned char data)
- {
- I2C_init();
- I2C_transmit_char(slave,data);
- I2C_release();
- }
- void readbyte();
- {
- }
- void onewreset1()
- {
- I2C_init();
- I2C_transmit_char( 0x30, 0xB4);// A5h 1w-wire reset byte
- I2C_release(); // transmission stop condition
- }
- uchar onewreset()
- {
- I2C_init();
- I2C_transmit_char( 0x30, 0xB4); // 1-wire reset byte
- I2C_release(); // transmission stop condition
- return SUCCESS;
- }
- void Dreset()
- {
- I2C_init();
- I2C_transmit_char( 0x30,0xF0);// 1-wire device reset byte
- I2C_release(); // transmission stop condition
- }
- uchar OWFirst( uchar resetSearch,uchar lastDevice, uchar deviceAddress)
- {
- LastDiscrepancy=0;
- deviceAddress=0;
- OWSearch1( resetSearch, &lastDevice, &deviceAddress);
- }
- uchar OWNext(uchar resetSearch, uchar lastdevice, uchar deviceAddress)
- {
- OWSearch1(resetSearch, &lastdevice, &deviceAddress);
- }
- // OWSearch
- //
- uchar OWSearch1(uchar resetSearch, uchar *lastDevice, uchar *deviceAddress)
- {
- uchar bit_number,last_zero,serial_byte_number,serial_byt e_mask;
- uchar firstBit,secondBit,dir,i, buff[3];
- //initialisation for search
- uchar retVal = FAILURE;
- bit_number = 1;
- last_zero = 0;
- serial_byte_number = 0;
- serial_byte_mask = 1;
- firstBit, secondBit, dir;
- i = 0;
- deviceAddress = (unsigned char *)malloc(8*sizeof(char));
- I2C_init();
- I2C_transmit_char(0x30, 0xF0);// perform a global reset of device
- I2C_restart();
- I2C_transmit_block( 0x30, buff,0);
- buff[2]=I2C_receive_char(0x31,buff, 0);
- I2C_release();
- // if the last call was not the last one
- if (!(*lastDevice))
- {
- // reset the 1-wire
- // if there are no parts on 1-wire, return FALSE
- if(!onewreset())
- {
- // reset the search
- *lastDevice = 0;
- LastDiscrepancy = 0;
- return FAILURE;
- }
- // Issue the Search ROM command
- writeByte(0x30,0xF0);
- I2C_restart();
- writeByte1(0x30,0xE1,0xF0); //slave adress+1w set pointer+save in read in status register
- // loop to do the search
- do
- {
- if ( bit_number < LastDiscrepancy )
- {
- if( ROM[serial_byte_number] & serial_byte_mask )
- {
- dir = 1;
- }
- else
- {
- dir = 0;
- }
- }
- else
- {
- // if equal to last pick 1, if not then pick 0
- if(bit_number == LastDiscrepancy)
- {
- dir =1;
- }
- if(bit_number > LastDiscrepancy)
- {
- dir =0;
- }
- }
- if(!owTriplet(&dir, &firstBit, &secondBit)) // genrate 3 time slotes..2 read slotes and 1 write slot
- {
- return FAILURE;
- }
- // if 0 was picked then record its position in LastZero
- if ( firstBit == 0 && secondBit == 0 && dir == 0 )
- {
- last_zero = bit_number;
- }
- // check for no devices on 1-wire
- if ( firstBit == 1 && secondBit == 1 )
- break;
- ****i deleted part of my program because of limited space to post message here!!
- }
- return retVal;
- }
- // owTriplet
- //
- // returns SUCCES or FAILURE
- //
- uchar owTriplet(uchar *diir, uchar *firsstBit, uchar *seccondBit)
once more i will be greatful for any help.
paul