Action
I2CSTART generates an I2C start condition.
I2CSTOP generates an I2C stop condition.
I2CRBYTE receives one byte from an I2C-device.
I2CWBYTE sends one byte to an I2C-device.
Syntax
I2CSTART
I2CSTOP
I2CRBYTE var, ack/nack
I2CWBYTE val
Remarks
Var |
A variable that receives the value from the I2C-device. |
ack/nack |
Specify ACK if there are more bytes to read.
Specify NACK if it is the last byte to read. |
Val |
A variable or constant to write to the I2C-device. |
These statements are provided as an addition to the I2CSEND and I2CRECEIVE statements.
While I2CSEND and I2CRECEIVE are well suited for most tasks, a slave chip might need a special sequence that is not possible with the I2C routines.
When an error occurs, the internal ERR variable will return 1. Otherwise it will be set to 0.
ASM
The I2C routines are located in the i2c.lib/i2c.lbx files.
See also
I2CSEND , I2CRECEIVE , I2CSTART , I2CSTOP, I2CRBYTE , I2CWBYTE
Example
'-----------------------------------------------------------------------------------------
'name : i2c.bas
'copyright : (c) 1995-2005, MCS Electronics
'purpose : demo: I2CSEND and I2CRECEIVE
'micro : Mega48
'suited for demo : yes
'commercial addon needed : no
'-----------------------------------------------------------------------------------------
$regfile = "m48def.dat" ' specify the used micro
$crystal = 4000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
Config Scl = Portb.4
Config Sda = Portb.5
Declare Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte)
Declare Sub Read_eeprom(byval Adres As Byte , Value As Byte)
Const Addressw = 174 'slave write address
Const Addressr = 175 'slave read address
Dim B1 As Byte , Adres As Byte , Value As Byte 'dim byte
Call Write_eeprom(1 , 3) 'write value of three to address 1 of EEPROM
Call Read_eeprom(1 , Value) : Print Value 'read it back
Call Read_eeprom(5 , Value) : Print Value 'again for address 5
'-------- now write to a PCF8474 I/O expander -------
I2csend &H40 , 255 'all outputs high
I2creceive &H40 , B1 'retrieve input
Print "Received data " ; B1 'print it
End
Rem Note That The Slaveaddress Is Adjusted Automaticly With I2csend & I2creceive
Rem This Means You Can Specify The Baseaddress Of The Chip.
'sample of writing a byte to EEPROM AT2404
Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte)
I2cstart 'start condition
I2cwbyte Addressw 'slave address
I2cwbyte Adres 'asdress of EEPROM
I2cwbyte Value 'value to write
I2cstop 'stop condition
Waitms 10 'wait for 10 milliseconds
End Sub
'sample of reading a byte from EEPROM AT2404
Sub Read_eeprom(byval Adres As Byte , Value As Byte)
I2cstart 'generate start
I2cwbyte Addressw 'slave adsress
I2cwbyte Adres 'address of EEPROM
I2cstart 'repeated start
I2cwbyte Addressr 'slave address (read)
I2crbyte Value , Nack 'read byte
I2cstop 'generate stop
End Sub
' when you want to control a chip with a larger memory like the 24c64 it requires an additional byte
' to be sent (consult the datasheet):
' Wires from the I2C address that are not connected will default to 0 in most cases!
' I2cstart 'start condition
' I2cwbyte &B1010_0000 'slave address
' I2cwbyte H 'high address
' I2cwbyte L 'low address
' I2cwbyte Value 'value to write
' I2cstop 'stop condition
' Waitms 10