SAM4SD32 (SAM4S-EK2)
Loading...
Searching...
No Matches
twi.h
Go to the documentation of this file.
1
33/*
34 * Support and FAQ: visit <a href="https://www.microchip.com/support/">Microchip Support</a>
35 */
36
37#ifndef TWI_H_INCLUDED
38#define TWI_H_INCLUDED
39
40#include "compiler.h"
41
43
44#ifdef __cplusplus
45extern "C" {
46#endif
49
51#define TWI_TIMEOUT 30000
52
57#define TWI_SUCCESS 0
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
65#define TWI_BUSY 8
66#define TWI_ERROR_TIMEOUT 9
70
74typedef struct twi_options {
76 uint32_t master_clk;
78 uint32_t speed;
80 uint8_t chip;
82 uint8_t smbus;
84
88typedef struct twi_packet {
90 uint8_t addr[3];
92 uint32_t addr_length;
94 void *buffer;
96 uint32_t length;
98 uint8_t chip;
100
101#if SAMG55
102enum twi_source_clock {
103 TWI_SOURCE_PERIPH_CLK = TWI_CWGR_BRSRCCLK_PERIPH_CLK,
104 TWI_SOURCE_PCK_CLK = TWI_CWGR_BRSRCCLK_PMC_PCK,
105};
106#endif
107
108void twi_enable_master_mode(Twi *p_twi);
109void twi_disable_master_mode(Twi *p_twi);
110uint32_t twi_master_init(Twi *p_twi, const twi_options_t *p_opt);
111uint32_t twi_set_speed(Twi *p_twi, uint32_t ul_speed, uint32_t ul_mck);
112uint32_t twi_probe(Twi *p_twi, uint8_t uc_slave_addr);
113uint32_t twi_master_read(Twi *p_twi, twi_packet_t *p_packet);
114uint32_t twi_master_write(Twi *p_twi, twi_packet_t *p_packet);
115void twi_enable_interrupt(Twi *p_twi, uint32_t ul_sources);
116void twi_disable_interrupt(Twi *p_twi, uint32_t ul_sources);
117uint32_t twi_get_interrupt_status(Twi *p_twi);
118uint32_t twi_get_interrupt_mask(Twi *p_twi);
119uint8_t twi_read_byte(Twi *p_twi);
120void twi_write_byte(Twi *p_twi, uint8_t uc_byte);
121void twi_enable_slave_mode(Twi *p_twi);
122void twi_disable_slave_mode(Twi *p_twi);
123void twi_slave_init(Twi *p_twi, uint32_t ul_device_addr);
124void twi_set_slave_addr(Twi *p_twi, uint32_t ul_device_addr);
125uint32_t twi_slave_read(Twi *p_twi, uint8_t *p_data);
126uint32_t twi_slave_write(Twi *p_twi, uint8_t *p_data);
127void twi_reset(Twi *p_twi);
128uint32_t twi_mk_addr(const uint8_t *addr, int len);
129Pdc *twi_get_pdc_base(Twi *p_twi);
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);
133#endif
134
135#if SAMG55
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);
145
151static inline void twi_enable_highspeed(Twi *p_twi)
152{
153 p_twi->TWI_CR = TWI_CR_HSEN;
154}
155
161static inline void twi_disable_highspeed(Twi *p_twi)
162{
163 p_twi->TWI_CR = TWI_CR_HSDIS;
164}
165
171static inline void twi_enable_smbus(Twi *p_twi)
172{
173 p_twi->TWI_CR = TWI_CR_SMBEN;
174}
175
181static inline void twi_disable_smbus(Twi *p_twi)
182{
183 p_twi->TWI_CR = TWI_CR_SMBDIS;
184}
185
191static inline void twi_enable_pec(Twi *p_twi)
192{
193 p_twi->TWI_CR = TWI_CR_PECEN;
194}
195
201static inline void twi_disable_pec(Twi *p_twi)
202{
203 p_twi->TWI_CR = TWI_CR_PECDIS;
204}
205
211static inline void twi_request_pec(Twi *p_twi)
212{
213 p_twi->TWI_CR = TWI_CR_PECRQ;
214}
215
221static inline void twi_send_clear(Twi *p_twi)
222{
223 p_twi->TWI_CR = TWI_CR_CLEAR;
224}
225
231static inline void twi_enable_alternative_command(Twi *p_twi)
232{
233 p_twi->TWI_CR = TWI_CR_ACMEN;
234}
235
241static inline void twi_disable_alternative_command(Twi *p_twi)
242{
243 p_twi->TWI_CR = TWI_CR_ACMDIS;
244}
245
251static inline void twi_thr_clear(Twi *p_twi)
252{
253 p_twi->TWI_CR = TWI_CR_THRCLR;
254}
255
261static inline void twi_lock_clear(Twi *p_twi)
262{
263 p_twi->TWI_CR = TWI_CR_LOCKCLR;
264}
265
271static inline void twi_disable_slave_nack(Twi *p_twi)
272{
273 p_twi->TWI_SMR &= ~TWI_SMR_NACKEN;
274}
275
281static inline void twi_enable_slave_nack(Twi *p_twi)
282{
283 p_twi->TWI_SMR |= TWI_SMR_NACKEN;
284}
285
291static inline void twi_disable_slave_default_addr(Twi *p_twi)
292{
293 p_twi->TWI_SMR &= ~TWI_SMR_SMDA;
294}
295
301static inline void twi_enable_slave_default_addr(Twi *p_twi)
302{
303 p_twi->TWI_SMR |= TWI_SMR_SMDA;
304}
305
311static inline void twi_disable_smbus_host_header(Twi *p_twi)
312{
313 p_twi->TWI_SMR &= ~TWI_SMR_SMHH;
314}
315
321static inline void twi_enable_smbus_host_header(Twi *p_twi)
322{
323 p_twi->TWI_SMR |= TWI_SMR_SMHH;
324}
325
331static inline void twi_disable_clock_wait_state(Twi *p_twi)
332{
333 p_twi->TWI_SMR |= TWI_SMR_SCLWSDIS;
334}
335
341static inline void twi_clear_disable_clock_wait_state(Twi *p_twi)
342{
343 p_twi->TWI_SMR &= ~TWI_SMR_SCLWSDIS;
344}
345
351static inline void twi_disable_slave_addr1_matching(Twi *p_twi)
352{
353 p_twi->TWI_SMR &= ~TWI_SMR_SADR1EN;
354}
355
361static inline void twi_enable_slave_addr1_matching(Twi *p_twi)
362{
363 p_twi->TWI_SMR |= TWI_SMR_SADR1EN;
364}
365
371static inline void twi_disable_slave_addr2_matching(Twi *p_twi)
372{
373 p_twi->TWI_SMR &= ~TWI_SMR_SADR2EN;
374}
375
381static inline void twi_enable_slave_addr2_matching(Twi *p_twi)
382{
383 p_twi->TWI_SMR |= TWI_SMR_SADR2EN;
384}
385
391static inline void twi_disable_slave_addr3_matching(Twi *p_twi)
392{
393 p_twi->TWI_SMR &= ~TWI_SMR_SADR3EN;
394}
395
401static inline void twi_enable_slave_addr3_matching(Twi *p_twi)
402{
403 p_twi->TWI_SMR |= TWI_SMR_SADR3EN;
404}
405
411static inline void twi_disable_slave_data_matching(Twi *p_twi)
412{
413 p_twi->TWI_SMR &= ~TWI_SMR_DATAMEN;
414}
415
422static inline void twi_select_source_clock(Twi *p_twi, enum twi_source_clock src_clk)
423{
424 p_twi->TWI_CWGR &= ~TWI_CWGR_BRSRCCLK;
425 p_twi->TWI_CWGR |= src_clk;
426}
427#endif
428
430
431#ifdef __cplusplus
432}
433#endif
436
437#endif /* TWI_H_INCLUDED */
438
uint32_t twi_get_interrupt_mask(Twi *p_twi)
Read TWI interrupt mask.
Definition twi.c:453
void twi_disable_interrupt(Twi *p_twi, uint32_t ul_sources)
Disable TWI interrupts.
Definition twi.c:426
uint8_t twi_read_byte(Twi *p_twi)
Reads a byte from the TWI bus.
Definition twi.c:465
uint32_t twi_slave_write(Twi *p_twi, uint8_t *p_data)
Write data to TWI bus.
Definition twi.c:583
uint32_t twi_slave_read(Twi *p_twi, uint8_t *p_data)
Read data from master.
Definition twi.c:551
uint32_t twi_probe(Twi *p_twi, uint8_t uc_slave_addr)
Test if a chip answers a given I2C address.
Definition twi.c:219
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.
Definition twi.c:476
uint32_t twi_mk_addr(const uint8_t *addr, int len)
Construct the TWI module address register field.
Definition twi.c:249
void twi_set_slave_addr(Twi *p_twi, uint32_t ul_device_addr)
Set TWI slave address.
Definition twi.c:535
uint32_t twi_get_interrupt_status(Twi *p_twi)
Get TWI interrupt status.
Definition twi.c:441
Pdc * twi_get_pdc_base(Twi *p_twi)
Get TWI PDC base address.
Definition twi.c:623
void twi_enable_master_mode(Twi *p_twi)
Enable TWI master mode.
Definition twi.c:89
void twi_disable_master_mode(Twi *p_twi)
Disable TWI master mode.
Definition twi.c:104
void twi_enable_interrupt(Twi *p_twi, uint32_t ul_sources)
Enable TWI interrupts.
Definition twi.c:414
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.
Definition twi.c:156
void twi_enable_slave_mode(Twi *p_twi)
Enable TWI slave mode.
Definition twi.c:486
void twi_reset(Twi *p_twi)
Reset TWI.
Definition twi.c:609
void twi_disable_slave_mode(Twi *p_twi)
Disable TWI slave mode.
Definition twi.c:501
uint32_t twi_master_write(Twi *p_twi, twi_packet_t *p_packet)
Write multiple bytes to a TWI compatible slave device.
Definition twi.c:353
uint32_t twi_master_init(Twi *p_twi, const twi_options_t *p_opt)
Initialize TWI master mode.
Definition twi.c:118
void twi_slave_init(Twi *p_twi, uint32_t ul_device_addr)
Initialize TWI slave mode.
Definition twi.c:513
uint32_t twi_master_read(Twi *p_twi, twi_packet_t *p_packet)
Read multiple bytes from a TWI compatible slave device.
Definition twi.c:278
Twi hardware registers.
__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.
Definition twi.h:74
uint32_t speed
The baud rate of the TWI bus.
Definition twi.h:78
uint8_t smbus
SMBUS mode (set 1 to use SMBUS quick command, otherwise don't).
Definition twi.h:82
uint8_t chip
The desired address.
Definition twi.h:80
uint32_t master_clk
MCK for TWI.
Definition twi.h:76
Information concerning the data transmission.
Definition twi.h:88
uint32_t addr_length
Length of the TWI data address segment (1-3 bytes).
Definition twi.h:92
void * buffer
Where to find the data to be transferred.
Definition twi.h:94
uint32_t length
How many bytes do we want to transfer.
Definition twi.h:96
uint8_t chip
TWI chip address to communicate with.
Definition twi.h:98
uint8_t addr[3]
TWI address/commands to issue to the other chip (node).
Definition twi.h:90
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.