21 #include "common_util.h" 24 #include "isr_manager.h" 32 bool transfer_finished;
40 #define TWIM_ID CONCAT_2(NRF_TWIM,TWIM_USED) 41 #define TWIM_IRQN TWIM_IRQN_a(TWIM_USED) 42 #define TWIM_IRQ_Handler TWIM_IRQ_Handler_a(TWIM_USED) 44 #define TWIM_IRQN_a(n) TWIM_IRQN_b(n) 45 #define TWIM_IRQN_b(n) SPIM##n##_SPIS##n##_TWIM##n##_TWIS##n##_SPI##n##_TWI##n##_IRQn 47 #define TWIM_IRQ_Handler_a(n) TWIM_IRQ_Handler_b(n) 48 #define TWIM_IRQ_Handler_b(n) SPIM##n##_SPIS##n##_TWIM##n##_TWIS##n##_SPI##n##_TWI##n##_IRQHandler 51 #define TWIM_EVENT_CLEAR(x) do{ \ 59 if(twim_status.evt_mask | (1 << txfr))
61 twim_status.handler(
TWIM_ERR_NONE, twim_status.current_transfer);
65 static void clear_all_events(
void)
67 TWIM_ID->EVENTS_ERROR = 0;
68 TWIM_ID->EVENTS_LASTRX = 0;
69 TWIM_ID->EVENTS_LASTTX = 0;
70 TWIM_ID->EVENTS_RXSTARTED = 0;
71 TWIM_ID->EVENTS_STOPPED = 0;
72 TWIM_ID->EVENTS_SUSPENDED = 0;
73 TWIM_ID->EVENTS_TXSTARTED = 0;
76 static void handle_error(
void)
79 TWIM_ID->INTENCLR = TWIM_INTENCLR_STOPPED_Msk;
80 (void)TWIM_ID->INTENCLR;
83 if((TWIM_ID->ERRORSRC & TWIM_ERRORSRC_ANACK_Msk))
85 TWIM_ID->ERRORSRC = TWIM_ERRORSRC_ANACK_Msk;
89 if((TWIM_ID->ERRORSRC & TWIM_ERRORSRC_DNACK_Msk))
91 TWIM_ID->ERRORSRC = TWIM_ERRORSRC_DNACK_Msk;
94 twim_status.handler(err, twim_status.current_transfer);
97 TWIM_ID->TASKS_STOP = 1;
103 NRF_GPIO->PIN_CNF[config->
scl] =
104 ( (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
105 | (GPIO_PIN_CNF_DRIVE_H0D1 << GPIO_PIN_CNF_DRIVE_Pos)
106 | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
107 | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
108 | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos));
109 NRF_GPIO->PIN_CNF[config->
sda] =
110 ( (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
111 | (GPIO_PIN_CNF_DRIVE_H0D1 << GPIO_PIN_CNF_DRIVE_Pos)
112 | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
113 | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
114 | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos));
116 twim_status.scl = TWIM_ID->PSEL.SCL = config->
scl;
117 twim_status.sda = TWIM_ID->PSEL.SDA = config->
sda;
120 TWIM_ID->ADDRESS = config->
address;
122 TWIM_ID->TXD.LIST = TWIM_TXD_LIST_LIST_Msk;
125 NVIC_ClearPendingIRQ(TWIM_IRQN);
127 NVIC_EnableIRQ(TWIM_IRQN);
129 TWIM_ID->ENABLE = TWIM_ENABLE_ENABLE_Enabled << TWIM_ENABLE_ENABLE_Pos;
130 twim_status.evt_mask = config->
evt_mask;
132 twim_status.transfer_finished =
true;
133 twim_status.on =
true;
138 if(twim_status.on ==
false){
141 twim_status.on =
false;
142 TWIM_ID->ENABLE = TWIM_ENABLE_ENABLE_Disabled << TWIM_ENABLE_ENABLE_Pos;
144 NVIC_ClearPendingIRQ(TWIM_IRQN);
145 NVIC_DisableIRQ(TWIM_IRQN);
148 NRF_GPIO->PIN_CNF[twim_status.scl] =
149 ( (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
150 | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
151 | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
152 | (GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos)
153 | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos));
154 NRF_GPIO->PIN_CNF[twim_status.sda] =
155 ( (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
156 | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
157 | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
158 | (GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos)
159 | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos));
161 TWIM_ID->ADDRESS = 0;
165 if(twim_status.on ==
false)
171 if(TWIM_ID->EVENTS_STOPPED)
173 twim_status.transfer_finished =
true;
177 if(twim_status.transfer_finished ==
false)
193 TWIM_ID->TXD.PTR = (uint32_t) tx_ptr;
194 TWIM_ID->TXD.MAXCNT = tx_len;
195 TWIM_ID->SHORTS = TWIM_SHORTS_LASTTX_STOP_Msk;
196 TWIM_ID->TASKS_STARTTX = 1;
198 twim_status.current_transfer =
TWIM_TX;
199 twim_status.transfer_finished =
false;
202 TWIM_ID->INTEN = TWIM_INTENSET_ERROR_Msk;
203 (void)TWIM_ID->INTEN;
204 TWIM_ID->INTENSET = (twim_status.evt_mask & TWIM_TX_DONE_MSK)?
205 (TWIM_INTENSET_STOPPED_Msk) : 0 ;
219 TWIM_ID->RXD.PTR = (uint32_t) rx_ptr;
220 TWIM_ID->RXD.MAXCNT = rx_len;
221 TWIM_ID->SHORTS = TWIM_SHORTS_LASTRX_STOP_Msk;
222 TWIM_ID->TASKS_STARTRX = 1;
224 twim_status.current_transfer =
TWIM_RX;
225 twim_status.transfer_finished =
false;
228 TWIM_ID->INTEN = TWIM_INTENSET_ERROR_Msk;
229 (void)TWIM_ID->INTEN;
230 TWIM_ID->INTENSET = (twim_status.evt_mask & TWIM_RX_DONE_MSK)?
231 (TWIM_INTENSET_STOPPED_Msk) : 0 ;
237 uint8_t * rx_ptr, uint32_t rx_len)
246 TWIM_ID->TXD.PTR = (uint32_t) tx_ptr;
247 TWIM_ID->TXD.MAXCNT = tx_len;
248 TWIM_ID->RXD.PTR = (uint32_t) rx_ptr;
249 TWIM_ID->RXD.MAXCNT = rx_len;
250 TWIM_ID->SHORTS = TWIM_SHORTS_LASTTX_STARTRX_Msk |
251 TWIM_SHORTS_LASTRX_STOP_Msk;
252 TWIM_ID->TASKS_STARTTX = 1;
255 twim_status.transfer_finished =
false;
258 TWIM_ID->INTEN = TWIM_INTENSET_ERROR_Msk;
259 (void)TWIM_ID->INTEN;
260 TWIM_ID->INTENSET = (twim_status.evt_mask & TWIM_TX_RX_DONE_MSK)?
261 (TWIM_INTENSET_STOPPED_Msk) : 0 ;
268 return TWIM_ID->ADDRESS;
271 void hal_twim_Handler (
void)
273 void TWIM_IRQ_Handler(
void)
276 if(TWIM_ID->EVENTS_ERROR == 1){
278 TWIM_EVENT_CLEAR(TWIM_ID->EVENTS_ERROR);
283 if(TWIM_ID->EVENTS_STOPPED == 1){
285 TWIM_EVENT_CLEAR(TWIM_ID->EVENTS_STOPPED);
287 twim_status.transfer_finished =
true;
289 send_event(twim_status.current_transfer);
uint32_t irq_priority
Interrupt priority.
uint32_t evt_mask
Event Mask for specifying which successful transfer type calls the handler.
hal_twim_freq_t frequency
TWI frequency.
twim_ret_status hal_twim_rx(uint8_t *rx_ptr, uint32_t rx_len)
Start a Rx only TWI transfer.
The TWIM peripheral is not initialized.
The slave device generated an error on the data bytes.
twim_transfer_t
Defines for the types of transfers possible.
uint32_t hal_twim_get_current_adrs(void)
Get the current specified address of the I2C slave.
void(* evt_handler)(twim_err_t evt, twim_transfer_t transfer)
The slave device generated an error on the address bytes.
void hal_twim_uninit(void)
Function for uninitializing and disabling one of the TWIM peripheral.
twim_err_t
Defines for the types of errors possible during TWI transactions.
A Tx transfer followed by Rx with a repeated start.
twim_ret_status
Defines for the return values for the transfer calls.
No error for this transfer.
twim_ret_status hal_twim_tx_rx(uint8_t *tx_ptr, uint32_t tx_len, uint8_t *rx_ptr, uint32_t rx_len)
Start a Tx TWI transfer followed by a Rx by repeated start.
A transfer is already happening.
Transfer successfully started.
Structure for the TWI master driver initialization.
uint32_t scl
SCL pin number.
uint32_t sda
SDA pin number.
void hal_twim_init(hal_twim_init_config_t *config)
Function for initializing and enabling one of the TWIM peripheral.
twim_ret_status hal_twim_tx(uint8_t *tx_ptr, uint32_t tx_len)
Start a Tx only TWI transfer.