205 const int ppre1 = (RCC->CFGR & RCC_CFGR_PPRE1) >> 10;
206 const int divFactor = (ppre1 & 1 << 2) ? (2 << (ppre1 & 0x3)) : 1;
207 const int fpclk1 = SystemCoreClock / divFactor;
211 FastInterruptDisableLock dLock;
214 RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN;
217 RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
222 NVIC_SetPriority(DMA1_Stream7_IRQn, 10);
223 NVIC_ClearPendingIRQ(
225 NVIC_EnableIRQ(DMA1_Stream7_IRQn);
227 NVIC_SetPriority(DMA1_Stream0_IRQn, 10);
228 NVIC_ClearPendingIRQ(
230 NVIC_EnableIRQ(DMA1_Stream0_IRQn);
233 NVIC_SetPriority(I2C1_EV_IRQn, 10);
234 NVIC_ClearPendingIRQ(I2C1_EV_IRQn);
235 NVIC_EnableIRQ(I2C1_EV_IRQn);
237 NVIC_SetPriority(I2C1_ER_IRQn, 10);
238 NVIC_ClearPendingIRQ(I2C1_ER_IRQn);
239 NVIC_EnableIRQ(I2C1_ER_IRQn);
241 I2C1->CR1 = I2C_CR1_SWRST;
243 I2C1->CR2 = fpclk1 / 1000000;
245 const int i2cSpeed = 100000;
247 std::max(4, fpclk1 / (2 * i2cSpeed));
250 I2C1->TRISE = fpclk1 / 1000000 + 1;
251 I2C1->CR1 = I2C_CR1_PE;
263 if (start(address) ==
false || (I2C1->SR2 & I2C_SR2_TRA) == 0)
265 I2C1->CR1 |= I2C_CR1_STOP;
270 waiting = Thread::getCurrentThread();
271 DMA1_Stream7->CR = 0;
272 DMA1_Stream7->PAR =
reinterpret_cast<unsigned int>(&I2C1->DR);
273 DMA1_Stream7->M0AR =
reinterpret_cast<unsigned int>(data);
274 DMA1_Stream7->NDTR = len;
275 DMA1_Stream7->FCR = DMA_SxFCR_FEIE | DMA_SxFCR_DMDIS;
276 DMA1_Stream7->CR = DMA_SxCR_CHSEL_0
286 I2C1->CR2 |= I2C_CR2_DMAEN | I2C_CR2_ITERREN;
289 FastInterruptDisableLock dLock;
294 FastInterruptEnableLock eLock(dLock);
300 DMA1_Stream7->CR = 0;
303 I2C1->CR2 &= ~(I2C_CR2_ITEVTEN | I2C_CR2_ITERREN);
306 I2C1->CR2 |= I2C_CR2_ITERREN;
308 const uint8_t* txData =
reinterpret_cast<const uint8_t*
>(data);
309 for (
int i = 0; i < len; i++)
311 I2C1->DR = txData[i];
312 while (!(I2C1->SR1 & I2C_SR1_TXE))
316 I2C1->CR2 &= ~I2C_CR2_ITERREN;
345 I2C1->CR1 |= I2C_CR1_STOP;
346 while (I2C1->SR2 & I2C_SR2_MSL)
362 if (start(address, len == 1) ==
false || I2C1->SR2 & I2C_SR2_TRA)
364 I2C1->CR1 |= I2C_CR1_STOP;
369 waiting = Thread::getCurrentThread();
372 I2C1->CR2 |= I2C_CR2_DMAEN | I2C_CR2_LAST | I2C_CR2_ITERREN;
374 DMA1_Stream0->CR = 0;
375 DMA1_Stream0->PAR =
reinterpret_cast<unsigned int>(&I2C1->DR);
376 DMA1_Stream0->M0AR =
reinterpret_cast<unsigned int>(data);
377 DMA1_Stream0->NDTR = len;
378 DMA1_Stream0->FCR = DMA_SxFCR_FEIE | DMA_SxFCR_DMDIS;
379 DMA1_Stream0->CR = DMA_SxCR_CHSEL_0
387 FastInterruptDisableLock dLock;
393 FastInterruptEnableLock eLock(dLock);
399 DMA1_Stream7->CR = 0;
401 I2C1->CR2 &= ~(I2C_CR2_DMAEN | I2C_CR2_LAST | I2C_CR2_ITERREN);
411 rxBuf =
reinterpret_cast<uint8_t*
>(data);
415 I2C1->CR2 |= I2C_CR2_ITERREN | I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN;
421 FastInterruptDisableLock dLock;
426 FastInterruptEnableLock eLock(dLock);
431 I2C1->CR2 &= ~(I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN);
434 I2C1->CR1 &= ~I2C_CR1_ACK;
435 I2C1->CR1 |= I2C_CR1_STOP;
437 while (!(I2C1->SR1 & I2C_SR1_RXNE))
439 rxBuf[len - 1] = I2C1->DR;
444 I2C1->CR2 &= ~I2C_CR2_ITERREN;
447 while (I2C1->SR2 & I2C_SR2_MSL)