CONFIG TWI
(Created page with "= <span class="f_Header">Action</span> = Configure the TWI (two wire serial interface). <span style="font-family: Arial;"> </span> <span style="font-family: Arial;">&n...") |
|||
| Line 134: | Line 134: | ||
Loop | Loop | ||
End | End | ||
| − | </source>< | + | </source> |
| + | |||
| + | = <span style="font-size: 19px; font-weight: bold;">XMEGA SAMPLE</span> = | ||
| + | |||
| + | <source lang="bascomavr"> | ||
| + | '---------------------------------------------------------------- | ||
| + | ' (c) 1995-2013, MCS | ||
| + | ' xm128-TWI.bas | ||
| + | ' This sample demonstrates the Xmega128A1 TWI | ||
| + | '----------------------------------------------------------------- | ||
| + | |||
| + | $regfile = "xm128a1def.dat" | ||
| + | $crystal = 32000000 | ||
| + | $hwstack = 64 | ||
| + | $swstack = 40 | ||
| + | $framesize = 40 | ||
| + | |||
| + | |||
| + | Dim S As String * 20 | ||
| + | |||
| + | 'first enable the osc of your choice | ||
| + | Config Osc = Enabled , 32mhzosc = Enabled | ||
| + | |||
| + | 'configure the systemclock | ||
| + | Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1 | ||
| + | |||
| + | Dim N As String * 16 , B As Byte | ||
| + | Config Com1 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 | ||
| + | Config Input1 = Cr , Echo = Crlf ' CR is used for input, we echo back CR and LF | ||
| + | |||
| + | Open "COM1:" For Binary As #1 | ||
| + | ' ^^^^ change from COM1-COM8 | ||
| + | |||
| + | Print #1 , "Xmega revision:" ; Mcu_revid ' make sure it is 7 or higher !!! lower revs have many flaws | ||
| + | |||
| + | Const Usechannel = 1 | ||
| + | |||
| + | |||
| + | Dim B1 As Byte , B2 As Byte | ||
| + | Dim W As Word At B1 Overlay | ||
| + | |||
| + | |||
| + | Open "twic" For Binary As #4 ' or use TWID,TWIE oR TWIF | ||
| + | Config Twic = 100000 'CONFIG TWI will ENABLE the TWI master interface | ||
| + | 'you can also use TWIC, TWID, TWIE of TWIF | ||
| + | '!!!!!!!!!!! WITHOUT a channel identifier, TWIC will be used !!!!!!!!!!!!!! | ||
| + | |||
| + | #if Usechannel = 1 | ||
| + | I2cinit #4 | ||
| + | #else | ||
| + | I2cinit | ||
| + | #endif | ||
| + | |||
| + | |||
| + | Do | ||
| + | I2cstart 'since not # is used, TWIC will be used | ||
| + | Waitms 20 | ||
| + | I2cwbyte &H70 ' slave address write | ||
| + | Waitms 20 | ||
| + | I2cwbyte &B10101010 ' write command | ||
| + | Waitms 20 | ||
| + | I2cwbyte 2 | ||
| + | Waitms 20 | ||
| + | I2cstop | ||
| + | Print "Error : " ; Err ' show error status | ||
| + | |||
| + | 'waitms 50 | ||
| + | Print "start" | ||
| + | I2cstart | ||
| + | Print "Error : " ; Err ' show error | ||
| + | I2cwbyte &H71 | ||
| + | Print "Error : " ; Err ' show error | ||
| + | I2crbyte B1 , Ack | ||
| + | Print "Error : " ; Err ' show error | ||
| + | I2crbyte B2 , Nack | ||
| + | Print "Error : " ; Err ' show error | ||
| + | I2cstop | ||
| + | Print "received A/D : " ; W ; "-" ; B1 ; "-" ; B2 | ||
| + | Waitms 500 'wait a bit | ||
| + | Loop | ||
| + | |||
| + | |||
| + | |||
| + | Dim J As Byte , C As Byte , K As Byte | ||
| + | Dim Twi_start As Byte ' you MUST dim this variable since it is used by the lib | ||
| + | |||
| + | 'determine if we have an i2c slave on the bus | ||
| + | For J = 0 To 200 Step 2 | ||
| + | Print J | ||
| + | #if Usechannel = 1 | ||
| + | I2cstart #4 | ||
| + | #else | ||
| + | I2cstart | ||
| + | #endif | ||
| + | |||
| + | I2cwbyte J | ||
| + | If Err = 0 Then ' no errors | ||
| + | Print "FOUND : " ; Hex(j) | ||
| + | 'write some value to the pcf8574A | ||
| + | #if Usechannel = 1 | ||
| + | I2cwbyte &B1100_0101 , #4 | ||
| + | #else | ||
| + | I2cwbyte &B1100_0101 | ||
| + | #endif | ||
| + | Print Err | ||
| + | Exit For | ||
| + | End If | ||
| + | #if Usechannel = 1 | ||
| + | I2cstop #4 | ||
| + | #else | ||
| + | I2cstop | ||
| + | #endif | ||
| + | Next | ||
| + | #if Usechannel = 1 | ||
| + | I2cstop #4 | ||
| + | #else | ||
| + | I2cstop | ||
| + | #endif | ||
| + | |||
| + | #if Usechannel = 1 | ||
| + | I2cstart #4 | ||
| + | I2cwbyte &H71 , #4 'read address | ||
| + | I2crbyte J , Ack , #4 | ||
| + | Print Bin(j) ; " err:" ; Err | ||
| + | I2crbyte J , Ack , #4 | ||
| + | Print Bin(j) ; " err:" ; Err | ||
| + | I2crbyte J , Nack , #4 | ||
| + | Print Bin(j) ; " err:" ; Err | ||
| + | I2cstop #4 | ||
| + | #else | ||
| + | I2cstart | ||
| + | I2cwbyte &H71 'read address | ||
| + | I2crbyte J , Ack | ||
| + | Print Bin(j) ; " err:" ; Err | ||
| + | I2crbyte J , Ack | ||
| + | Print Bin(j) ; " err:" ; Err | ||
| + | I2crbyte J , Nack | ||
| + | Print Bin(j) ; " err:" ; Err | ||
| + | I2cstop | ||
| + | #endif | ||
| + | |||
| + | 'try a transaction | ||
| + | #if Usechannel = 1 | ||
| + | I2csend &H70 , 255 , #4 ' all 1 | ||
| + | Waitms 1000 | ||
| + | I2csend &H70 , 0 , #4 'all 0 | ||
| + | #else | ||
| + | I2csend &H70 , 255 | ||
| + | Waitms 1000 | ||
| + | I2csend &H70 , 0 | ||
| + | #endif | ||
| + | Print Err | ||
| + | |||
| + | |||
| + | 'read transaction | ||
| + | Dim Var As Byte | ||
| + | Var = &B11111111 | ||
| + | #if Usechannel = 1 | ||
| + | I2creceive &H70 , Var , 1 , 1 , #4 ' send and receive | ||
| + | Print Bin(var) ; "-" ; Err | ||
| + | I2creceive &H70 , Var , 0 , 1 , #4 ' just receive | ||
| + | Print Bin(var) ; "-" ; Err | ||
| + | #else | ||
| + | I2creceive &H70 , Var , 1 , 1 ' send and receive | ||
| + | Print Bin(var) ; "-" ; Err | ||
| + | I2creceive &H70 , Var , 0 , 1 ' just receive | ||
| + | Print Bin(var) ; "-" ; Err | ||
| + | #endif | ||
| + | |||
| + | End | ||
| + | </source> | ||
| + | |||
| + | {{Languages}} | ||
[[Category:BASCOM Language Reference]] | [[Category:BASCOM Language Reference]] | ||
Revision as of 11:51, 24 August 2013
Contents |
Action
Configure the TWI (two wire serial interface).
Syntax
CONFIG TWI = clockspeed
CONFIG TWIC | TWID | TWIE | TWIF = clockspeed
(Config TWI is for ATMEGA and Config TWIX is for ATXMEGA chips)
Remarks
|
clockspeed |
The desired clock frequency for SCL |
CONFIG TWI will set TWSR pre scaler bits 0 and 1, and TWBR depending on the used $CRYSTAL frequency and the desired SCL clock speed.
Typical you need a speed of 400 KHz. Some devices will work on 100 KHz as well.
When TWI is used in SLAVE mode, you need to have a faster clock speed as the master.
XMEGA
The XMEGA can contain up to 4 TWI units. When not specifying TWIC, TWID, TWIE or TWIF, the TWIC will be used as the default.
You MUST dimension a variable named TWI_START as a byte. It is used by the xmega TWI library code. Without it, you will get an error.
There are 2 manuals available from ATMEL for every ATXMEGA Chip
| 1. | One Family Manual like for example for a ATXMEGA128A1 it is Atmel AVR XMEGA A Manual |
| 2. | Another Manual for the single chips like for example for an ATXMEGA128A1 it is the ATxmega64A1/128A1/192A1/256A1/384A1 Manual. In this Manual you find for example the Alternate Pin Functions. So you can find which Pin on Port C is the SDA and SCL Pin when you want to use the I2C/TWI Interface of this Port. |
It is important that you specify the proper crystal frequency. Otherwise it will result in a wrong TWI clock frequency.
See also
Example
'----------------------------------------------------------------------- ' (c) 2004 MCS Electronics ' This demo shows an example of the TWI ' Not all AVR chips have TWI (hardware I2C) '------------------------------------------------------------------------ 'The chip will work in TWI/I2C master mode 'Connected is a PCF8574A 8-bits port extender $regfile="M8def.dat"' the used chip $crystal= 4000000 ' frequency used $baud= 19200 ' baud rate $lib"i2c_twi.lbx"' we do not use software emulated I2C but the TWI Config Scl =Portc.5 ' we need to provide the SCL pin name Config Sda =Portc.4 ' we need to provide the SDA pin name 'On the Mega8, On the PCF8574A 'scl=PC5 , pin 28 pin 14 'sda=PC4 , pin 27 pin 15 I2cinit' we need to set the pins in the proper state Config Twi = 100000 ' wanted clock frequency 'will set TWBR and TWSR 'Twbr = 12 'bit rate register 'Twsr = 0 'pre scaler bits Dim B AsByte, X AsByte Print"TWI master" Do Incr B ' increase value I2csend&B01110000 , B ' send the value Print"Error : ";Err' show error status I2creceive&B01110000 , X ' get a byte Print X ;" ";Err' show error Waitms 500 'wait a bit Loop End
XMEGA SAMPLE
'---------------------------------------------------------------- ' (c) 1995-2013, MCS ' xm128-TWI.bas ' This sample demonstrates the Xmega128A1 TWI '----------------------------------------------------------------- $regfile = "xm128a1def.dat" $crystal = 32000000 $hwstack = 64 $swstack = 40 $framesize = 40 Dim S As String * 20 'first enable the osc of your choice Config Osc = Enabled , 32mhzosc = Enabled 'configure the systemclock Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1 Dim N As String * 16 , B As Byte Config Com1 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 Config Input1 = Cr , Echo = Crlf ' CR is used for input, we echo back CR and LF Open "COM1:" For Binary As #1 ' ^^^^ change from COM1-COM8 Print #1 , "Xmega revision:" ; Mcu_revid ' make sure it is 7 or higher !!! lower revs have many flaws Const Usechannel = 1 Dim B1 As Byte , B2 As Byte Dim W As Word At B1 Overlay Open "twic" For Binary As #4 ' or use TWID,TWIE oR TWIF Config Twic = 100000 'CONFIG TWI will ENABLE the TWI master interface 'you can also use TWIC, TWID, TWIE of TWIF '!!!!!!!!!!! WITHOUT a channel identifier, TWIC will be used !!!!!!!!!!!!!! #if Usechannel = 1 I2cinit #4 #else I2cinit #endif Do I2cstart 'since not # is used, TWIC will be used Waitms 20 I2cwbyte &H70 ' slave address write Waitms 20 I2cwbyte &B10101010 ' write command Waitms 20 I2cwbyte 2 Waitms 20 I2cstop Print "Error : " ; Err ' show error status 'waitms 50 Print "start" I2cstart Print "Error : " ; Err ' show error I2cwbyte &H71 Print "Error : " ; Err ' show error I2crbyte B1 , Ack Print "Error : " ; Err ' show error I2crbyte B2 , Nack Print "Error : " ; Err ' show error I2cstop Print "received A/D : " ; W ; "-" ; B1 ; "-" ; B2 Waitms 500 'wait a bit Loop Dim J As Byte , C As Byte , K As Byte Dim Twi_start As Byte ' you MUST dim this variable since it is used by the lib 'determine if we have an i2c slave on the bus For J = 0 To 200 Step 2 Print J #if Usechannel = 1 I2cstart #4 #else I2cstart #endif I2cwbyte J If Err = 0 Then ' no errors Print "FOUND : " ; Hex(j) 'write some value to the pcf8574A #if Usechannel = 1 I2cwbyte &B1100_0101 , #4 #else I2cwbyte &B1100_0101 #endif Print Err Exit For End If #if Usechannel = 1 I2cstop #4 #else I2cstop #endif Next #if Usechannel = 1 I2cstop #4 #else I2cstop #endif #if Usechannel = 1 I2cstart #4 I2cwbyte &H71 , #4 'read address I2crbyte J , Ack , #4 Print Bin(j) ; " err:" ; Err I2crbyte J , Ack , #4 Print Bin(j) ; " err:" ; Err I2crbyte J , Nack , #4 Print Bin(j) ; " err:" ; Err I2cstop #4 #else I2cstart I2cwbyte &H71 'read address I2crbyte J , Ack Print Bin(j) ; " err:" ; Err I2crbyte J , Ack Print Bin(j) ; " err:" ; Err I2crbyte J , Nack Print Bin(j) ; " err:" ; Err I2cstop #endif 'try a transaction #if Usechannel = 1 I2csend &H70 , 255 , #4 ' all 1 Waitms 1000 I2csend &H70 , 0 , #4 'all 0 #else I2csend &H70 , 255 Waitms 1000 I2csend &H70 , 0 #endif Print Err 'read transaction Dim Var As Byte Var = &B11111111 #if Usechannel = 1 I2creceive &H70 , Var , 1 , 1 , #4 ' send and receive Print Bin(var) ; "-" ; Err I2creceive &H70 , Var , 0 , 1 , #4 ' just receive Print Bin(var) ; "-" ; Err #else I2creceive &H70 , Var , 1 , 1 ' send and receive Print Bin(var) ; "-" ; Err I2creceive &H70 , Var , 0 , 1 ' just receive Print Bin(var) ; "-" ; Err #endif End
| Languages | English • Deutsch |
|---|