56TivaI2C::TivaI2C(
const char *name,
unsigned long base, uint32_t interrupt,
bool fast_mode)
59 , interrupt(interrupt)
70 MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
73 MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1);
76 MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C2);
79 MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C3);
82 MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C4);
85 MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C5);
88 MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C6);
91 MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C7);
94 MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C8);
97 MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C9);
102 MAP_I2CMasterInitExpClk(
base, cm3_cpu_clock_hz, fast_mode);
108 std::min(0xff, configKERNEL_INTERRUPT_PRIORITY + 0x20));
109 MAP_I2CMasterIntEnableEx(
base, I2C_MASTER_INT_TIMEOUT |
110 I2C_MASTER_INT_DATA);
120 int bytes = msg->len;
122 if (msg->flags & I2C_M_RD)
125 MAP_I2CMasterSlaveAddrSet(
base, msg->addr,
true);
128 if (stop && msg->len == 1)
131 MAP_I2CMasterControl(
base, I2C_MASTER_CMD_SINGLE_RECEIVE);
136 MAP_I2CMasterControl(
base, I2C_MASTER_CMD_BURST_RECEIVE_START);
142 MAP_I2CMasterSlaveAddrSet(
base, msg->addr,
false);
143 MAP_I2CMasterDataPut(
base, *msg->buf);
146 if (stop && msg->len == 1)
149 MAP_I2CMasterControl(
base, I2C_MASTER_CMD_SINGLE_SEND);
154 MAP_I2CMasterControl(
base, I2C_MASTER_CMD_BURST_SEND_START);
184 g_status = status = MAP_I2CMasterIntStatusEx(
base,
true);
185 MAP_I2CMasterIntClearEx(
base, status);
187 if (error & I2C_MCS_ARBLST)
192 else if (error & I2C_MCS_DATACK)
197 else if (error & I2C_MCS_ADRACK)
202 else if (status & I2C_MASTER_INT_TIMEOUT)
207 else if (status & I2C_MASTER_INT_DATA)
209 if (
msg_->flags & I2C_M_RD)
221 MAP_I2CMasterControl(
base, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
226 MAP_I2CMasterControl(
base, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
241 MAP_I2CMasterControl(
base, I2C_MASTER_CMD_BURST_SEND_FINISH);
246 MAP_I2CMasterControl(
base, I2C_MASTER_CMD_BURST_SEND_CONT);
263 sem.post_from_isr(&woken);
264 os_isr_exit_yield_test(woken);