51#define TWI_TIMEOUT 30000
58#define TWI_INVALID_ARGUMENT 1
59#define TWI_ARBITRATION_LOST 2
60#define TWI_NO_CHIP_FOUND 3
61#define TWI_RECEIVE_OVERRUN 4
62#define TWI_RECEIVE_NACK 5
63#define TWI_SEND_OVERRUN 6
64#define TWI_SEND_NACK 7
66#define TWI_ERROR_TIMEOUT 9
102enum twi_source_clock {
103 TWI_SOURCE_PERIPH_CLK = TWI_CWGR_BRSRCCLK_PERIPH_CLK,
104 TWI_SOURCE_PCK_CLK = TWI_CWGR_BRSRCCLK_PMC_PCK,
130#if (SAM4E || SAM4C || SAMG || SAM4CP || SAM4CM)
131void twi_set_write_protection(
Twi *p_twi,
bool flag);
132void twi_read_write_protection_status(
Twi *p_twi, uint32_t *p_status);
136void twi_smbus_set_timing(
Twi *p_twi, uint32_t ul_timing);
137void twi_set_alternative_command(
Twi *p_twi, uint32_t ul_alt_cmd);
138void twi_set_filter(
Twi *p_twi, uint32_t ul_filter);
139void twi_mask_slave_addr(
Twi *p_twi, uint32_t ul_mask);
140void twi_set_sleepwalking(
Twi *p_twi,
141 uint32_t ul_matching_addr1,
bool flag1,
142 uint32_t ul_matching_addr2,
bool flag2,
143 uint32_t ul_matching_addr3,
bool flag3,
144 uint32_t ul_matching_data,
bool flag);
151static inline void twi_enable_highspeed(
Twi *p_twi)
153 p_twi->
TWI_CR = TWI_CR_HSEN;
161static inline void twi_disable_highspeed(
Twi *p_twi)
163 p_twi->
TWI_CR = TWI_CR_HSDIS;
171static inline void twi_enable_smbus(
Twi *p_twi)
173 p_twi->
TWI_CR = TWI_CR_SMBEN;
181static inline void twi_disable_smbus(
Twi *p_twi)
183 p_twi->
TWI_CR = TWI_CR_SMBDIS;
191static inline void twi_enable_pec(
Twi *p_twi)
193 p_twi->
TWI_CR = TWI_CR_PECEN;
201static inline void twi_disable_pec(
Twi *p_twi)
203 p_twi->
TWI_CR = TWI_CR_PECDIS;
211static inline void twi_request_pec(
Twi *p_twi)
213 p_twi->
TWI_CR = TWI_CR_PECRQ;
221static inline void twi_send_clear(
Twi *p_twi)
223 p_twi->
TWI_CR = TWI_CR_CLEAR;
231static inline void twi_enable_alternative_command(
Twi *p_twi)
233 p_twi->
TWI_CR = TWI_CR_ACMEN;
241static inline void twi_disable_alternative_command(
Twi *p_twi)
243 p_twi->
TWI_CR = TWI_CR_ACMDIS;
251static inline void twi_thr_clear(
Twi *p_twi)
253 p_twi->
TWI_CR = TWI_CR_THRCLR;
261static inline void twi_lock_clear(
Twi *p_twi)
263 p_twi->
TWI_CR = TWI_CR_LOCKCLR;
271static inline void twi_disable_slave_nack(
Twi *p_twi)
273 p_twi->
TWI_SMR &= ~TWI_SMR_NACKEN;
281static inline void twi_enable_slave_nack(
Twi *p_twi)
283 p_twi->
TWI_SMR |= TWI_SMR_NACKEN;
291static inline void twi_disable_slave_default_addr(
Twi *p_twi)
293 p_twi->
TWI_SMR &= ~TWI_SMR_SMDA;
301static inline void twi_enable_slave_default_addr(
Twi *p_twi)
303 p_twi->
TWI_SMR |= TWI_SMR_SMDA;
311static inline void twi_disable_smbus_host_header(
Twi *p_twi)
313 p_twi->
TWI_SMR &= ~TWI_SMR_SMHH;
321static inline void twi_enable_smbus_host_header(
Twi *p_twi)
323 p_twi->
TWI_SMR |= TWI_SMR_SMHH;
331static inline void twi_disable_clock_wait_state(
Twi *p_twi)
333 p_twi->
TWI_SMR |= TWI_SMR_SCLWSDIS;
341static inline void twi_clear_disable_clock_wait_state(
Twi *p_twi)
343 p_twi->
TWI_SMR &= ~TWI_SMR_SCLWSDIS;
351static inline void twi_disable_slave_addr1_matching(
Twi *p_twi)
353 p_twi->
TWI_SMR &= ~TWI_SMR_SADR1EN;
361static inline void twi_enable_slave_addr1_matching(
Twi *p_twi)
363 p_twi->
TWI_SMR |= TWI_SMR_SADR1EN;
371static inline void twi_disable_slave_addr2_matching(
Twi *p_twi)
373 p_twi->
TWI_SMR &= ~TWI_SMR_SADR2EN;
381static inline void twi_enable_slave_addr2_matching(
Twi *p_twi)
383 p_twi->
TWI_SMR |= TWI_SMR_SADR2EN;
391static inline void twi_disable_slave_addr3_matching(
Twi *p_twi)
393 p_twi->
TWI_SMR &= ~TWI_SMR_SADR3EN;
401static inline void twi_enable_slave_addr3_matching(
Twi *p_twi)
403 p_twi->
TWI_SMR |= TWI_SMR_SADR3EN;
411static inline void twi_disable_slave_data_matching(
Twi *p_twi)
413 p_twi->
TWI_SMR &= ~TWI_SMR_DATAMEN;
422static inline void twi_select_source_clock(
Twi *p_twi,
enum twi_source_clock src_clk)
424 p_twi->
TWI_CWGR &= ~TWI_CWGR_BRSRCCLK;
uint32_t twi_get_interrupt_mask(Twi *p_twi)
Read TWI interrupt mask.
void twi_disable_interrupt(Twi *p_twi, uint32_t ul_sources)
Disable TWI interrupts.
uint8_t twi_read_byte(Twi *p_twi)
Reads a byte from the TWI bus.
uint32_t twi_slave_write(Twi *p_twi, uint8_t *p_data)
Write data to TWI bus.
uint32_t twi_slave_read(Twi *p_twi, uint8_t *p_data)
Read data from master.
uint32_t twi_probe(Twi *p_twi, uint8_t uc_slave_addr)
Test if a chip answers a given I2C address.
void twi_write_byte(Twi *p_twi, uint8_t uc_byte)
Sends a byte of data to one of the TWI slaves on the bus.
uint32_t twi_mk_addr(const uint8_t *addr, int len)
Construct the TWI module address register field.
void twi_set_slave_addr(Twi *p_twi, uint32_t ul_device_addr)
Set TWI slave address.
uint32_t twi_get_interrupt_status(Twi *p_twi)
Get TWI interrupt status.
Pdc * twi_get_pdc_base(Twi *p_twi)
Get TWI PDC base address.
void twi_enable_master_mode(Twi *p_twi)
Enable TWI master mode.
void twi_disable_master_mode(Twi *p_twi)
Disable TWI master mode.
void twi_enable_interrupt(Twi *p_twi, uint32_t ul_sources)
Enable TWI interrupts.
uint32_t twi_set_speed(Twi *p_twi, uint32_t ul_speed, uint32_t ul_mck)
Set the I2C bus speed in conjunction with the clock frequency.
void twi_enable_slave_mode(Twi *p_twi)
Enable TWI slave mode.
void twi_reset(Twi *p_twi)
Reset TWI.
void twi_disable_slave_mode(Twi *p_twi)
Disable TWI slave mode.
uint32_t twi_master_write(Twi *p_twi, twi_packet_t *p_packet)
Write multiple bytes to a TWI compatible slave device.
uint32_t twi_master_init(Twi *p_twi, const twi_options_t *p_opt)
Initialize TWI master mode.
void twi_slave_init(Twi *p_twi, uint32_t ul_device_addr)
Initialize TWI slave mode.
uint32_t twi_master_read(Twi *p_twi, twi_packet_t *p_packet)
Read multiple bytes from a TWI compatible slave device.
__IO uint32_t TWI_CWGR
(Twi Offset: 0x10) Clock Waveform Generator Register
__O uint32_t TWI_CR
(Twi Offset: 0x00) Control Register
__IO uint32_t TWI_SMR
(Twi Offset: 0x08) Slave Mode Register
Input parameters when initializing the TWI module mode.
uint32_t speed
The baud rate of the TWI bus.
uint8_t smbus
SMBUS mode (set 1 to use SMBUS quick command, otherwise don't).
uint8_t chip
The desired address.
uint32_t master_clk
MCK for TWI.
Information concerning the data transmission.
uint32_t addr_length
Length of the TWI data address segment (1-3 bytes).
void * buffer
Where to find the data to be transferred.
uint32_t length
How many bytes do we want to transfer.
uint8_t chip
TWI chip address to communicate with.
uint8_t addr[3]
TWI address/commands to issue to the other chip (node).
struct twi_packet twi_packet_t
Information concerning the data transmission.
struct twi_options twi_options_t
Input parameters when initializing the TWI module mode.