39 #include "contiki-conf.h"
47 #define NO_INTERFACE 0xFF
49 static uint8_t slave_addr = 0x00;
50 static uint8_t
interface = NO_INTERFACE;
56 if(ti_lib_prcm_power_domain_status(PRCM_DOMAIN_SERIAL)
57 != PRCM_DOMAIN_POWER_ON) {
62 if(!(HWREG(PRCM_BASE + PRCM_O_I2CCLKGR) & PRCM_I2CCLKGR_CLK_EN)) {
73 ti_lib_prcm_power_domain_on(PRCM_DOMAIN_SERIAL);
74 while((ti_lib_prcm_power_domain_status(PRCM_DOMAIN_SERIAL)
75 != PRCM_DOMAIN_POWER_ON));
78 ti_lib_prcm_peripheral_run_enable(PRCM_PERIPH_I2C0);
79 ti_lib_prcm_load_set();
80 while(!ti_lib_prcm_load_get());
83 ti_lib_i2c_master_init_exp_clk(
I2C0_BASE, ti_lib_sys_ctrl_clock_get(),
92 status = ti_lib_i2c_master_err(
I2C0_BASE);
93 if(status & (I2C_MSTAT_DATACK_N_M | I2C_MSTAT_ADRACK_N_M)) {
94 ti_lib_i2c_master_control(
I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
97 return status == I2C_MASTER_ERR_NONE;
103 interface = NO_INTERFACE;
109 ti_lib_prcm_peripheral_run_disable(PRCM_PERIPH_I2C0);
110 ti_lib_prcm_load_set();
111 while(!ti_lib_prcm_load_get());
138 ti_lib_i2c_master_slave_addr_set(
I2C0_BASE, slave_addr,
false);
141 ti_lib_i2c_master_data_put(
I2C0_BASE, data[0]);
144 while(ti_lib_i2c_master_bus_busy(
I2C0_BASE));
147 ti_lib_i2c_master_control(
I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);
148 while(ti_lib_i2c_master_busy(
I2C0_BASE));
149 success = i2c_status();
151 for(i = 1; i < len && success; i++) {
153 ti_lib_i2c_master_data_put(
I2C0_BASE, data[i]);
156 ti_lib_i2c_master_control(
I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
157 while(ti_lib_i2c_master_busy(
I2C0_BASE));
158 success = i2c_status();
165 ti_lib_i2c_master_control(
I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
166 while(ti_lib_i2c_master_busy(
I2C0_BASE));
167 success = i2c_status();
168 while(ti_lib_i2c_master_bus_busy(
I2C0_BASE));
180 ti_lib_i2c_master_slave_addr_set(
I2C0_BASE, slave_addr,
false);
183 ti_lib_i2c_master_data_put(
I2C0_BASE, data);
186 while(ti_lib_i2c_master_bus_busy(
I2C0_BASE));
189 ti_lib_i2c_master_control(
I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
190 while(ti_lib_i2c_master_busy(
I2C0_BASE));
191 success = i2c_status();
203 ti_lib_i2c_master_slave_addr_set(
I2C0_BASE, slave_addr,
true);
206 while(ti_lib_i2c_master_bus_busy(
I2C0_BASE));
209 ti_lib_i2c_master_control(
I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
213 while(i < (len - 1) && success) {
214 while(ti_lib_i2c_master_busy(
I2C0_BASE));
215 success = i2c_status();
217 data[i] = ti_lib_i2c_master_data_get(
I2C0_BASE);
218 ti_lib_i2c_master_control(
I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
224 while(ti_lib_i2c_master_busy(
I2C0_BASE));
225 success = i2c_status();
227 data[len - 1] = ti_lib_i2c_master_data_get(
I2C0_BASE);
228 ti_lib_i2c_master_control(
I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
229 while(ti_lib_i2c_master_bus_busy(
I2C0_BASE));
243 ti_lib_i2c_master_slave_addr_set(
I2C0_BASE, slave_addr,
false);
246 ti_lib_i2c_master_data_put(
I2C0_BASE, wdata[0]);
249 while(ti_lib_i2c_master_bus_busy(
I2C0_BASE));
252 ti_lib_i2c_master_control(
I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);
253 while(ti_lib_i2c_master_busy(
I2C0_BASE));
254 success = i2c_status();
256 for(i = 1; i < wlen && success; i++) {
258 ti_lib_i2c_master_data_put(
I2C0_BASE, wdata[i]);
261 ti_lib_i2c_master_control(
I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
262 while(ti_lib_i2c_master_busy(
I2C0_BASE));
263 success = i2c_status();
271 ti_lib_i2c_master_slave_addr_set(
I2C0_BASE, slave_addr,
true);
274 ti_lib_i2c_master_control(
I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
277 while(i < (rlen - 1) && success) {
278 while(ti_lib_i2c_master_busy(
I2C0_BASE));
279 success = i2c_status();
281 rdata[i] = ti_lib_i2c_master_data_get(
I2C0_BASE);
282 ti_lib_i2c_master_control(
I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
288 while(ti_lib_i2c_master_busy(
I2C0_BASE));
289 success = i2c_status();
291 rdata[rlen - 1] = ti_lib_i2c_master_data_get(
I2C0_BASE);
292 ti_lib_i2c_master_control(
I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
293 while(ti_lib_i2c_master_bus_busy(
I2C0_BASE));
303 slave_addr = address;
305 if(accessible() ==
false) {
309 if(new_interface != interface) {
310 interface = new_interface;
314 if(interface == BOARD_I2C_INTERFACE_0) {
320 }
else if(interface == BOARD_I2C_INTERFACE_1) {
329 ti_lib_i2c_master_init_exp_clk(
I2C0_BASE, ti_lib_sys_ctrl_clock_get(),
#define BOARD_IOID_SCL_HP
Interface 1 SCL: MPU.
Header file with macros which rename TI CC26xxware functions.
bool board_i2c_write(uint8_t *data, uint8_t len)
Burst write to an I2C device.
#define BOARD_IOID_SDA
I2C IOID mappings.
bool board_i2c_write_read(uint8_t *wdata, uint8_t wlen, uint8_t *rdata, uint8_t rlen)
Write and read in one operation.
void board_i2c_shutdown()
Stops the I2C peripheral and restores pins to s/w control.
bool board_i2c_write_single(uint8_t data)
Single write to an I2C device.
bool board_i2c_read(uint8_t *data, uint8_t len)
Burst read from an I2C device.
void board_i2c_select(uint8_t new_interface, uint8_t address)
Select an I2C slave.
Header file for the Sensortag-CC26xx I2C Driver.
void board_i2c_wakeup()
Enables the I2C peripheral with defaults.
#define BOARD_IOID_SDA_HP
Interface 1 SDA: MPU.
#define I2C0_BASE
Peripheral I2C0 base address.
#define BOARD_IOID_SCL
I2C IOID mappings.