Two wire interface. More...
Defines | |
#define | TWI_PIO_ASR PIOA_ASR |
#define | TWI_PIO_PDR PIOA_PDR |
#define | TWI_PIO_MDER PIOA_MDER |
Functions | |
int | NutTwiMasterTranceive (NUTTWIBUS *bus, uint8_t sla, const void *txdata, uint16_t txlen, void *rxdata, uint16_t rxsiz, uint32_t tmo) |
Transmit and/or receive data as a master. | |
int | NutTwiMasterRegRead (NUTTWIBUS *bus, uint8_t sla, uint32_t iadr, uint8_t iadrlen, void *rxdata, uint16_t rxsiz, uint32_t tmo) |
Receive data as a master from a device having internal addressable registers. | |
int | NutTwiMasterRegWrite (NUTTWIBUS *bus, uint8_t sla, uint32_t iadr, uint8_t iadrlen, const void *txdata, uint16_t txsiz, uint32_t tmo) |
Transmit data as a master to a device having internal addressable registers. | |
int | NutTwiMasterError (NUTTWIBUS *bus) |
Get last master mode error. | |
int | NutTwiSlaveListen (NUTTWIBUS *bus, uint8_t *sla, void *rxdata, uint16_t rxsiz, uint32_t tmo) |
Listen for incoming data from a master. | |
int | NutTwiSlaveRespond (NUTTWIBUS *bus, void *txdata, uint16_t txlen, uint32_t tmo) |
Send response to a master. | |
int | NutTwiSlaveError (NUTTWIBUS *bus) |
Get last slave mode error. | |
uint16_t | NutTwiIndexes (NUTTWIBUS *bus, uint8_t idx) |
Get last transfer results. | |
int | NutTwiSetSpeed (NUTTWIBUS *bus, uint32_t speed) |
Set Speed of I2C Interface. | |
int | NutTwiGetSpeed (NUTTWIBUS *bus) |
Request Current Speed of I2C Interface. | |
int | NutTwiIOCtl (NUTTWIBUS *bus, int req, void *conf) |
Perform TWI control functions. | |
int | At91TwiInit (void) |
Initialize TWI interface hardware. | |
int | NutRegisterTwiBus (NUTTWIBUS *bus, uint8_t sla) |
Initialize TWI interface bus. | |
int | NutDestroyTwiBus (NUTTWIBUS *bus) |
Variables | |
NUTTWIBUS | At91TwiBus |
TWI/I2C bus structure. | |
TWI Control Register | |
#define | TWI_CR_OFF 0x00000000 |
Control register offset. | |
#define | TWI_CR (TWI_BASE + TWI_CR_OFF) |
Control register address. | |
#define | TWI_START 0x00000001 |
Send start condition. | |
#define | TWI_STOP 0x00000002 |
Send stop condition. | |
#define | TWI_MSEN 0x00000004 |
Enable master mode. | |
#define | TWI_MSDIS 0x00000008 |
Disable master mode. | |
#define | TWI_SVEN 0x00000010 |
Enable slave mode. | |
#define | TWI_SVDIS 0x00000020 |
Disable slave mode. | |
#define | TWI_SWRST 0x00000080 |
Software reset. | |
TWI Master Mode Register | |
#define | TWI_MMR_OFF 0x00000004 |
Master mode register offset. | |
#define | TWI_MMR (TWI_BASE + TWI_MMR_OFF) |
Master mode register address. | |
#define | TWI_IADRSZ 0x00000300 |
Internal device address size mask. | |
#define | TWI_IADRSZ_NONE 0x00000000 |
No internal device address. | |
#define | TWI_IADRSZ_1BYTE 0x00000100 |
One byte internal device address. | |
#define | TWI_IADRSZ_2BYTE 0x00000200 |
Two byte internal device address. | |
#define | TWI_IADRSZ_3BYTE 0x00000300 |
Three byte internal device address. | |
#define | TWI_MREAD 0x00001000 |
Master read direction. | |
#define | TWI_DADR 0x007F0000 |
Device address mask. | |
#define | TWI_DADR_LSB 16 |
Device address LSB. | |
TWI Slave Mode Register | |
#define | TWI_SMR_OFF 0x00000008 |
Slave mode register offset. | |
#define | TWI_SMR (TWI_BASE + TWI_SMR_OFF) |
Slave mode register address. | |
#define | TWI_SADR 0x007F0000 |
Slave address mask. | |
#define | TWI_SADR_LSB 16 |
Slave address LSB. | |
TWI Internal Address Register | |
#define | TWI_IADRR_OFF 0x0000000C |
Internal address register offset. | |
#define | TWI_IADRR (TWI_BASE + TWI_IADRR_OFF) |
Internal address register address. | |
#define | TWI_IADR 0x00FFFFFF |
Internal address mask. | |
#define | TWI_IADR_LSB 0 |
Internal address LSB. | |
TWI Clock Waveform Generator Register | |
#define | TWI_CWGR_OFF 0x00000010 |
Clock waveform generator register offset. | |
#define | TWI_CWGR (TWI_BASE + TWI_CWGR_OFF) |
Clock waveform generator register address. | |
#define | TWI_CLDIV 0x000000FF |
Clock low divider mask. | |
#define | TWI_CLDIV_LSB 0 |
Clock low divider LSB. | |
#define | TWI_CHDIV 0x0000FF00 |
Clock high divider mask. | |
#define | TWI_CHDIV_LSB 8 |
Clock high divider LSB. | |
#define | TWI_CKDIV 0x00070000 |
Clock divider mask. | |
#define | TWI_CKDIV_LSB 16 |
Clock divider LSB. | |
TWI Status and Interrupt Registers | |
#define | TWI_SR_OFF 0x00000020 |
Status register offset. | |
#define | TWI_SR (TWI_BASE + TWI_SR_OFF) |
Status register address. | |
#define | TWI_IER_OFF 0x00000024 |
Interrupt enable register offset. | |
#define | TWI_IER (TWI_BASE + TWI_IER_OFF) |
Interrupt enable register address. | |
#define | TWI_IDR_OFF 0x00000028 |
Interrupt disable register offset. | |
#define | TWI_IDR (TWI_BASE + TWI_IDR_OFF) |
Interrupt disable register address. | |
#define | TWI_IMR_OFF 0x0000002C |
Interrupt mask register offset. | |
#define | TWI_IMR (TWI_BASE + TWI_IMR_OFF) |
Interrupt mask register address. | |
#define | TWI_TXCOMP 0x00000001 |
Transmission completed. | |
#define | TWI_RXRDY 0x00000002 |
Receive holding register ready. | |
#define | TWI_TXRDY 0x00000004 |
Transmit holding register ready. | |
#define | TWI_SVREAD 0x00000008 |
Slave read. | |
#define | TWI_SVACC 0x00000010 |
Slave access. | |
#define | TWI_GACC 0x00000020 |
General call access. | |
#define | TWI_OVRE 0x00000040 |
Overrun error. | |
#define | TWI_NACK 0x00000100 |
Not acknowledged. | |
#define | TWI_ARBLST 0x00000200 |
Arbitration lost. | |
#define | TWI_SCLWS 0x00000400 |
Clock wait state. | |
#define | TWI_EOSACC 0x00000800 |
End of slave access. | |
TWI Receive Holding Register | |
#define | TWI_RHR_OFF 0x00000030 |
Receive holding register offset. | |
#define | TWI_RHR (TWI_BASE + TWI_RHR_OFF) |
Receive holding register address. | |
TWI Transmit Holding Register | |
#define | TWI_THR_OFF 0x00000034 |
Transmit holding register offset. | |
#define | TWI_THR (TWI_BASE + TWI_THR_OFF) |
Transmit holding register address. |
Two wire interface.
#define TWI_CR_OFF 0x00000000 |
Control register offset.
#define TWI_CR (TWI_BASE + TWI_CR_OFF) |
Control register address.
Referenced by At91TwiInit(), NutTwiMasterRegRead(), and NutTwiMasterTranceive().
#define TWI_START 0x00000001 |
Send start condition.
Referenced by NutTwiMasterRegRead(), and NutTwiMasterTranceive().
#define TWI_STOP 0x00000002 |
Send stop condition.
Referenced by NutTwiMasterRegRead(), and NutTwiMasterTranceive().
#define TWI_MSEN 0x00000004 |
Enable master mode.
Referenced by At91TwiInit().
#define TWI_MSDIS 0x00000008 |
Disable master mode.
#define TWI_SVEN 0x00000010 |
Enable slave mode.
#define TWI_SVDIS 0x00000020 |
Disable slave mode.
Referenced by At91TwiInit().
#define TWI_SWRST 0x00000080 |
Software reset.
Referenced by At91TwiInit().
#define TWI_MMR_OFF 0x00000004 |
Master mode register offset.
#define TWI_MMR (TWI_BASE + TWI_MMR_OFF) |
Master mode register address.
Referenced by NutTwiMasterRegRead(), NutTwiMasterRegWrite(), and NutTwiMasterTranceive().
#define TWI_IADRSZ 0x00000300 |
Internal device address size mask.
#define TWI_IADRSZ_NONE 0x00000000 |
No internal device address.
#define TWI_IADRSZ_1BYTE 0x00000100 |
One byte internal device address.
#define TWI_IADRSZ_2BYTE 0x00000200 |
Two byte internal device address.
#define TWI_IADRSZ_3BYTE 0x00000300 |
Three byte internal device address.
#define TWI_MREAD 0x00001000 |
Master read direction.
Referenced by NutTwiMasterRegRead(), and NutTwiMasterTranceive().
#define TWI_DADR 0x007F0000 |
Device address mask.
#define TWI_DADR_LSB 16 |
Device address LSB.
Referenced by NutTwiMasterRegRead(), NutTwiMasterRegWrite(), and NutTwiMasterTranceive().
#define TWI_SMR_OFF 0x00000008 |
Slave mode register offset.
#define TWI_SMR (TWI_BASE + TWI_SMR_OFF) |
Slave mode register address.
#define TWI_SADR 0x007F0000 |
Slave address mask.
#define TWI_SADR_LSB 16 |
Slave address LSB.
#define TWI_IADRR_OFF 0x0000000C |
Internal address register offset.
#define TWI_IADRR (TWI_BASE + TWI_IADRR_OFF) |
Internal address register address.
Referenced by NutTwiMasterRegRead(), and NutTwiMasterRegWrite().
#define TWI_IADR 0x00FFFFFF |
Internal address mask.
#define TWI_IADR_LSB 0 |
Internal address LSB.
#define TWI_CWGR_OFF 0x00000010 |
Clock waveform generator register offset.
#define TWI_CWGR (TWI_BASE + TWI_CWGR_OFF) |
Clock waveform generator register address.
Referenced by NutTwiGetSpeed(), and NutTwiSetSpeed().
#define TWI_CLDIV 0x000000FF |
Clock low divider mask.
#define TWI_CLDIV_LSB 0 |
Clock low divider LSB.
#define TWI_CHDIV 0x0000FF00 |
Clock high divider mask.
#define TWI_CHDIV_LSB 8 |
Clock high divider LSB.
#define TWI_CKDIV 0x00070000 |
Clock divider mask.
#define TWI_CKDIV_LSB 16 |
Clock divider LSB.
#define TWI_SR_OFF 0x00000020 |
Status register offset.
#define TWI_SR (TWI_BASE + TWI_SR_OFF) |
Status register address.
#define TWI_IER_OFF 0x00000024 |
Interrupt enable register offset.
#define TWI_IER (TWI_BASE + TWI_IER_OFF) |
Interrupt enable register address.
Referenced by NutTwiMasterRegRead(), NutTwiMasterRegWrite(), and NutTwiMasterTranceive().
#define TWI_IDR_OFF 0x00000028 |
Interrupt disable register offset.
#define TWI_IDR (TWI_BASE + TWI_IDR_OFF) |
Interrupt disable register address.
Referenced by At91TwiInit(), NutTwiMasterRegRead(), NutTwiMasterRegWrite(), and NutTwiMasterTranceive().
#define TWI_IMR_OFF 0x0000002C |
Interrupt mask register offset.
#define TWI_IMR (TWI_BASE + TWI_IMR_OFF) |
Interrupt mask register address.
#define TWI_TXCOMP 0x00000001 |
Transmission completed.
#define TWI_RXRDY 0x00000002 |
Receive holding register ready.
Referenced by NutTwiMasterRegRead(), and NutTwiMasterTranceive().
#define TWI_TXRDY 0x00000004 |
Transmit holding register ready.
Referenced by NutTwiMasterRegWrite(), and NutTwiMasterTranceive().
#define TWI_SVREAD 0x00000008 |
Slave read.
#define TWI_SVACC 0x00000010 |
Slave access.
#define TWI_GACC 0x00000020 |
General call access.
#define TWI_OVRE 0x00000040 |
Overrun error.
#define TWI_NACK 0x00000100 |
Not acknowledged.
#define TWI_ARBLST 0x00000200 |
Arbitration lost.
#define TWI_SCLWS 0x00000400 |
Clock wait state.
#define TWI_EOSACC 0x00000800 |
End of slave access.
#define TWI_RHR_OFF 0x00000030 |
Receive holding register offset.
#define TWI_RHR (TWI_BASE + TWI_RHR_OFF) |
Receive holding register address.
#define TWI_THR_OFF 0x00000034 |
Transmit holding register offset.
#define TWI_THR (TWI_BASE + TWI_THR_OFF) |
Transmit holding register address.
Referenced by NutTwiMasterRegWrite(), and NutTwiMasterTranceive().
#define TWI_PIO_ASR PIOA_ASR |
Referenced by At91TwiInit().
#define TWI_PIO_PDR PIOA_PDR |
Referenced by At91TwiInit().
#define TWI_PIO_MDER PIOA_MDER |
Referenced by At91TwiInit().
int NutTwiMasterTranceive | ( | NUTTWIBUS * | bus, |
uint8_t | sla, | ||
const void * | txdata, | ||
uint16_t | txlen, | ||
void * | rxdata, | ||
uint16_t | rxsiz, | ||
uint32_t | tmo | ||
) |
Transmit and/or receive data as a master.
The two-wire serial interface must have been initialized by calling TwInit() before this function can be used.
sla | Slave address of the destination. This slave address must be specified as a 7-bit address. For example, the PCF8574A may be configured to slave addresses from 0x38 to 0x3F. |
txdata | Points to the data to transmit. Ignored, if the number of data bytes to transmit is zero. |
txlen | Number of data bytes to transmit. If zero, then the interface will not send any data to the slave device and will directly enter the master receive mode. |
rxdata | Points to a buffer, where the received data will be stored. Ignored, if the maximum number of bytes to receive is zero. |
rxsiz | Maximum number of bytes to receive. Set to zero, if no bytes are expected from the slave device. |
tmo | Timeout in milliseconds. To disable timeout, set this parameter to NUT_WAIT_INFINITE. |
References _NUTTWIBUS::bus_icb, _NUTTWIBUS::bus_mutex, NutEventPost(), NutEventWait(), outr, rc, _NUTTWIICB::tw_mm_buf, _NUTTWIICB::tw_mm_err, _NUTTWIICB::tw_mm_error, _NUTTWIICB::tw_mm_idx, _NUTTWIICB::tw_mm_len, _NUTTWIICB::tw_mm_mtx, TWERR_IF_LOCKED, TWERR_TIMEOUT, TWI_CR, TWI_DADR_LSB, TWI_IDR, TWI_IER, TWI_MMR, TWI_MREAD, TWI_RXRDY, TWI_START, TWI_STOP, TWI_THR, and TWI_TXRDY.
int NutTwiMasterRegRead | ( | NUTTWIBUS * | bus, |
uint8_t | sla, | ||
uint32_t | iadr, | ||
uint8_t | iadrlen, | ||
void * | rxdata, | ||
uint16_t | rxsiz, | ||
uint32_t | tmo | ||
) |
Receive data as a master from a device having internal addressable registers.
The two-wire serial interface must have been initialized by calling TwInit() before this function can be used.
sla | Slave address of the destination. This slave address must be specified as a 7-bit address. For example, the PCF8574A may be configured to slave addresses from 0x38 to 0x3F. |
iadr | Address send to the device to access certain registers or memory addresses of it. |
iadrlen | Number of bytes to send as address, maximum 3 bytes are supported from AT91SAM7 |
rxdata | Points to a buffer, where the received data will be stored. |
rxsiz | Maximum number of bytes to receive. |
tmo | Timeout in milliseconds. To disable timeout, set this parameter to NUT_WAIT_INFINITE. |
References _NUTTWIBUS::bus_icb, _NUTTWIBUS::bus_mutex, NutEventPost(), NutEventWait(), outr, rc, _NUTTWIICB::tw_mm_buf, _NUTTWIICB::tw_mm_err, _NUTTWIICB::tw_mm_error, _NUTTWIICB::tw_mm_idx, _NUTTWIICB::tw_mm_len, _NUTTWIICB::tw_mm_mtx, TWERR_IF_LOCKED, TWERR_TIMEOUT, TWI_CR, TWI_DADR_LSB, TWI_IADRR, TWI_IDR, TWI_IER, TWI_MMR, TWI_MREAD, TWI_RXRDY, TWI_START, and TWI_STOP.
int NutTwiMasterRegWrite | ( | NUTTWIBUS * | bus, |
uint8_t | sla, | ||
uint32_t | iadr, | ||
uint8_t | iadrlen, | ||
const void * | txdata, | ||
uint16_t | txsiz, | ||
uint32_t | tmo | ||
) |
Transmit data as a master to a device having internal addressable registers.
The two-wire serial interface must have been initialized by calling TwInit() before this function can be used.
sla | Slave address of the destination. This slave address must be specified as a 7-bit address. For example, the PCF8574A may be configured to slave addresses from 0x38 to 0x3F. |
iadr | Address send to the device to access certain registers or memory addresses of it. |
iadrlen | Number of bytes to send as address, maximum 3 bytes are supported from AT91SAM7 |
txdata | Points to a buffer, where the data to transmit will be stored. |
txsiz | Maximum number of bytes to transmit. |
tmo | Timeout in milliseconds. To disable timeout, set this parameter to NUT_WAIT_INFINITE. |
References _NUTTWIBUS::bus_icb, _NUTTWIBUS::bus_mutex, NutEventPost(), NutEventWait(), outb, outr, rc, _NUTTWIICB::tw_mm_buf, _NUTTWIICB::tw_mm_err, _NUTTWIICB::tw_mm_error, _NUTTWIICB::tw_mm_idx, _NUTTWIICB::tw_mm_len, _NUTTWIICB::tw_mm_mtx, TWERR_IF_LOCKED, TWERR_TIMEOUT, TWI_DADR_LSB, TWI_IADRR, TWI_IDR, TWI_IER, TWI_MMR, TWI_THR, and TWI_TXRDY.
int NutTwiMasterError | ( | NUTTWIBUS * | bus | ) |
Get last master mode error.
You may call this function to determine the specific cause of an error after twi transaction failed.
References _NUTTWIBUS::bus_icb, rc, and _NUTTWIICB::tw_mm_error.
int NutTwiSlaveListen | ( | NUTTWIBUS * | bus, |
uint8_t * | sla, | ||
void * | rxdata, | ||
uint16_t | rxsiz, | ||
uint32_t | tmo | ||
) |
Listen for incoming data from a master.
If this function returns without error, the bus is blocked. The caller must immediately process the request and return a response by calling TwSlaveRespond().
sla | Points to a byte variable, which receives the slave address sent by the master. This can be used by the caller to determine whether the the interface has been addressed by a general call or its individual address. |
rxdata | Points to a data buffer where the received data bytes are stored. |
rxsiz | Specifies the maximum number of data bytes to receive. |
tmo | Timeout in milliseconds. To disable timeout, set this parameter to NUT_WAIT_INFINITE. |
Send response to a master.
This function must be called as soon as possible after TwSlaveListen() returned successfully, even if no data needs to be returned. Not doing so will completely block the bus.
txdata | Points to the data to transmit. Ignored, if the number of bytes to transmit is zero. |
txlen | Number of data bytes to transmit. |
tmo | Timeout in milliseconds. To disable timeout, set this parameter to NUT_WAIT_INFINITE. |
int NutTwiSlaveError | ( | NUTTWIBUS * | bus | ) |
Get last slave mode error.
You may call this function to determine the specific cause of an error after TwSlaveListen() or TwSlaveRespond() failed.
References TWERR_BUS.
Get last transfer results.
You may call this function to determine how many bytes where transferred before the twi transaction failed.
References _NUTTWIBUS::bus_icb, _NUTTWIICB::tw_mm_error, and _NUTTWIICB::tw_mm_len.
Set Speed of I2C Interface.
Setup Interface Speed
References NULL, NUT_HWCLK_PERIPHERAL, NutClockGet, outr, rc, and TWI_CWGR.
Referenced by NutRegisterTwiBus(), and NutTwiIOCtl().
int NutTwiGetSpeed | ( | NUTTWIBUS * | bus | ) |
Request Current Speed of I2C Interface.
References inr, NutGetCpuClock(), rc, and TWI_CWGR.
Referenced by NutTwiIOCtl().
int NutTwiIOCtl | ( | NUTTWIBUS * | bus, |
int | req, | ||
void * | conf | ||
) |
Perform TWI control functions.
req | Requested control function. May be set to one of the following constants:
|
conf | Points to a buffer that contains any data required for the given control function or receives data from that function. |
References _NUTTWIBUS::bus_icb, NutTwiGetSpeed(), NutTwiSetSpeed(), rc, _NUTTWIICB::tw_mm_sla, TWI_GETSLAVEADDRESS, TWI_GETSPEED, TWI_GETSTATUS, TWI_SETSLAVEADDRESS, TWI_SETSPEED, and TWI_SETSTATUS.
int At91TwiInit | ( | void | ) |
Initialize TWI interface hardware.
References _BV, outr, PMC_PCER, rc, TWI_CR, TWI_ID, TWI_IDR, TWI_MSEN, TWI_PIO_ASR, TWI_PIO_MDER, TWI_PIO_PDR, TWI_SVDIS, and TWI_SWRST.
Initialize TWI interface bus.
The specified slave address is not used here as we don't support twi-slave on AT91SAM7X
sla | Slave address, must be specified as a 7-bit address, always lower than 128. |
References _NUTTWIBUS::bus_icb, _NUTTWIBUS::bus_initbus, _NUTTWIBUS::bus_mutex, _NUTTWIBUS::bus_sig_ev, memset(), NULL, NUT_IRQMODE_LEVEL, NutEventPost(), NutHeapAlloc, NutIrqEnable(), NutIrqSetMode(), NutRegisterIrqHandler(), NutTwiSetSpeed(), and rc.
int NutDestroyTwiBus | ( | NUTTWIBUS * | bus | ) |
References _NUTTWIBUS::bus_icb, _NUTTWIBUS::bus_sig_ev, NutHeapFree, and NutIrqDisable().