fsl_i2c.c 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757
  1. /*
  2. * Copyright (c) 2015, Freescale Semiconductor, Inc.
  3. * Copyright 2016-2017 NXP
  4. *
  5. * Redistribution and use in source and binary forms, with or without modification,
  6. * are permitted provided that the following conditions are met:
  7. *
  8. * o Redistributions of source code must retain the above copyright notice, this list
  9. * of conditions and the following disclaimer.
  10. *
  11. * o Redistributions in binary form must reproduce the above copyright notice, this
  12. * list of conditions and the following disclaimer in the documentation and/or
  13. * other materials provided with the distribution.
  14. *
  15. * o Neither the name of the copyright holder nor the names of its
  16. * contributors may be used to endorse or promote products derived from this
  17. * software without specific prior written permission.
  18. *
  19. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  20. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  21. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  22. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
  23. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  24. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  25. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  26. * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  28. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. */
  30. #include "fsl_i2c.h"
  31. /*******************************************************************************
  32. * Definitions
  33. ******************************************************************************/
  34. /*! @brief i2c transfer state. */
  35. enum _i2c_transfer_states
  36. {
  37. kIdleState = 0x0U, /*!< I2C bus idle. */
  38. kCheckAddressState = 0x1U, /*!< 7-bit address check state. */
  39. kSendCommandState = 0x2U, /*!< Send command byte phase. */
  40. kSendDataState = 0x3U, /*!< Send data transfer phase. */
  41. kReceiveDataBeginState = 0x4U, /*!< Receive data transfer phase begin. */
  42. kReceiveDataState = 0x5U, /*!< Receive data transfer phase. */
  43. };
  44. /*! @brief Common sets of flags used by the driver. */
  45. enum _i2c_flag_constants
  46. {
  47. /*! All flags which are cleared by the driver upon starting a transfer. */
  48. #if defined(FSL_FEATURE_I2C_HAS_START_STOP_DETECT) && FSL_FEATURE_I2C_HAS_START_STOP_DETECT
  49. kClearFlags = kI2C_ArbitrationLostFlag | kI2C_IntPendingFlag | kI2C_StartDetectFlag | kI2C_StopDetectFlag,
  50. kIrqFlags = kI2C_GlobalInterruptEnable | kI2C_StartStopDetectInterruptEnable,
  51. #elif defined(FSL_FEATURE_I2C_HAS_STOP_DETECT) && FSL_FEATURE_I2C_HAS_STOP_DETECT
  52. kClearFlags = kI2C_ArbitrationLostFlag | kI2C_IntPendingFlag | kI2C_StopDetectFlag,
  53. kIrqFlags = kI2C_GlobalInterruptEnable | kI2C_StopDetectInterruptEnable,
  54. #else
  55. kClearFlags = kI2C_ArbitrationLostFlag | kI2C_IntPendingFlag,
  56. kIrqFlags = kI2C_GlobalInterruptEnable,
  57. #endif
  58. };
  59. /*! @brief Typedef for interrupt handler. */
  60. typedef void (*i2c_isr_t)(I2C_Type *base, void *i2cHandle);
  61. /*******************************************************************************
  62. * Prototypes
  63. ******************************************************************************/
  64. /*!
  65. * @brief Get instance number for I2C module.
  66. *
  67. * @param base I2C peripheral base address.
  68. */
  69. uint32_t I2C_GetInstance(I2C_Type *base);
  70. /*!
  71. * @brief Set SCL/SDA hold time, this API receives SCL stop hold time, calculate the
  72. * closest SCL divider and MULT value for the SDA hold time, SCL start and SCL stop
  73. * hold time. To reduce the ROM size, SDA/SCL hold value mapping table is not provided,
  74. * assume SCL divider = SCL stop hold value *2 to get the closest SCL divider value and MULT
  75. * value, then the related SDA hold time, SCL start and SCL stop hold time is used.
  76. *
  77. * @param base I2C peripheral base address.
  78. * @param sourceClock_Hz I2C functional clock frequency in Hertz.
  79. * @param sclStopHoldTime_ns SCL stop hold time in ns.
  80. */
  81. static void I2C_SetHoldTime(I2C_Type *base, uint32_t sclStopHoldTime_ns, uint32_t sourceClock_Hz);
  82. /*!
  83. * @brief Set up master transfer, send slave address and decide the initial
  84. * transfer state.
  85. *
  86. * @param base I2C peripheral base address.
  87. * @param handle pointer to i2c_master_handle_t structure which stores the transfer state.
  88. * @param xfer pointer to i2c_master_transfer_t structure.
  89. */
  90. static status_t I2C_InitTransferStateMachine(I2C_Type *base, i2c_master_handle_t *handle, i2c_master_transfer_t *xfer);
  91. /*!
  92. * @brief Check and clear status operation.
  93. *
  94. * @param base I2C peripheral base address.
  95. * @param status current i2c hardware status.
  96. * @retval kStatus_Success No error found.
  97. * @retval kStatus_I2C_ArbitrationLost Transfer error, arbitration lost.
  98. * @retval kStatus_I2C_Nak Received Nak error.
  99. */
  100. static status_t I2C_CheckAndClearError(I2C_Type *base, uint32_t status);
  101. /*!
  102. * @brief Master run transfer state machine to perform a byte of transfer.
  103. *
  104. * @param base I2C peripheral base address.
  105. * @param handle pointer to i2c_master_handle_t structure which stores the transfer state
  106. * @param isDone input param to get whether the thing is done, true is done
  107. * @retval kStatus_Success No error found.
  108. * @retval kStatus_I2C_ArbitrationLost Transfer error, arbitration lost.
  109. * @retval kStatus_I2C_Nak Received Nak error.
  110. * @retval kStatus_I2C_Timeout Transfer error, wait signal timeout.
  111. */
  112. static status_t I2C_MasterTransferRunStateMachine(I2C_Type *base, i2c_master_handle_t *handle, bool *isDone);
  113. /*!
  114. * @brief I2C common interrupt handler.
  115. *
  116. * @param base I2C peripheral base address.
  117. * @param handle pointer to i2c_master_handle_t structure which stores the transfer state
  118. */
  119. static void I2C_TransferCommonIRQHandler(I2C_Type *base, void *handle);
  120. /*******************************************************************************
  121. * Variables
  122. ******************************************************************************/
  123. /*! @brief Pointers to i2c handles for each instance. */
  124. static void *s_i2cHandle[FSL_FEATURE_SOC_I2C_COUNT] = {NULL};
  125. /*! @brief SCL clock divider used to calculate baudrate. */
  126. static const uint16_t s_i2cDividerTable[] = {
  127. 20, 22, 24, 26, 28, 30, 34, 40, 28, 32, 36, 40, 44, 48, 56, 68,
  128. 48, 56, 64, 72, 80, 88, 104, 128, 80, 96, 112, 128, 144, 160, 192, 240,
  129. 160, 192, 224, 256, 288, 320, 384, 480, 320, 384, 448, 512, 576, 640, 768, 960,
  130. 640, 768, 896, 1024, 1152, 1280, 1536, 1920, 1280, 1536, 1792, 2048, 2304, 2560, 3072, 3840};
  131. /*! @brief Pointers to i2c bases for each instance. */
  132. static I2C_Type *const s_i2cBases[] = I2C_BASE_PTRS;
  133. /*! @brief Pointers to i2c IRQ number for each instance. */
  134. static const IRQn_Type s_i2cIrqs[] = I2C_IRQS;
  135. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  136. /*! @brief Pointers to i2c clocks for each instance. */
  137. static const clock_ip_name_t s_i2cClocks[] = I2C_CLOCKS;
  138. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  139. /*! @brief Pointer to master IRQ handler for each instance. */
  140. static i2c_isr_t s_i2cMasterIsr;
  141. /*! @brief Pointer to slave IRQ handler for each instance. */
  142. static i2c_isr_t s_i2cSlaveIsr;
  143. /*******************************************************************************
  144. * Codes
  145. ******************************************************************************/
  146. uint32_t I2C_GetInstance(I2C_Type *base)
  147. {
  148. uint32_t instance;
  149. /* Find the instance index from base address mappings. */
  150. for (instance = 0; instance < ARRAY_SIZE(s_i2cBases); instance++)
  151. {
  152. if (s_i2cBases[instance] == base)
  153. {
  154. break;
  155. }
  156. }
  157. assert(instance < ARRAY_SIZE(s_i2cBases));
  158. return instance;
  159. }
  160. static void I2C_SetHoldTime(I2C_Type *base, uint32_t sclStopHoldTime_ns, uint32_t sourceClock_Hz)
  161. {
  162. uint32_t multiplier;
  163. uint32_t computedSclHoldTime;
  164. uint32_t absError;
  165. uint32_t bestError = UINT32_MAX;
  166. uint32_t bestMult = 0u;
  167. uint32_t bestIcr = 0u;
  168. uint8_t mult;
  169. uint8_t i;
  170. /* Search for the settings with the lowest error. Mult is the MULT field of the I2C_F register,
  171. * and ranges from 0-2. It selects the multiplier factor for the divider. */
  172. /* SDA hold time = bus period (s) * mul * SDA hold value. */
  173. /* SCL start hold time = bus period (s) * mul * SCL start hold value. */
  174. /* SCL stop hold time = bus period (s) * mul * SCL stop hold value. */
  175. for (mult = 0u; (mult <= 2u) && (bestError != 0); ++mult)
  176. {
  177. multiplier = 1u << mult;
  178. /* Scan table to find best match. */
  179. for (i = 0u; i < sizeof(s_i2cDividerTable) / sizeof(s_i2cDividerTable[0]); ++i)
  180. {
  181. /* Assume SCL hold(stop) value = s_i2cDividerTable[i]/2. */
  182. computedSclHoldTime = ((multiplier * s_i2cDividerTable[i]) * 500000000U) / sourceClock_Hz;
  183. absError = sclStopHoldTime_ns > computedSclHoldTime ? (sclStopHoldTime_ns - computedSclHoldTime) :
  184. (computedSclHoldTime - sclStopHoldTime_ns);
  185. if (absError < bestError)
  186. {
  187. bestMult = mult;
  188. bestIcr = i;
  189. bestError = absError;
  190. /* If the error is 0, then we can stop searching because we won't find a better match. */
  191. if (absError == 0)
  192. {
  193. break;
  194. }
  195. }
  196. }
  197. }
  198. /* Set frequency register based on best settings. */
  199. base->F = I2C_F_MULT(bestMult) | I2C_F_ICR(bestIcr);
  200. }
  201. static status_t I2C_InitTransferStateMachine(I2C_Type *base, i2c_master_handle_t *handle, i2c_master_transfer_t *xfer)
  202. {
  203. status_t result = kStatus_Success;
  204. i2c_direction_t direction = xfer->direction;
  205. /* Initialize the handle transfer information. */
  206. handle->transfer = *xfer;
  207. /* Save total transfer size. */
  208. handle->transferSize = xfer->dataSize;
  209. /* Initial transfer state. */
  210. if (handle->transfer.subaddressSize > 0)
  211. {
  212. if (xfer->direction == kI2C_Read)
  213. {
  214. direction = kI2C_Write;
  215. }
  216. }
  217. handle->state = kCheckAddressState;
  218. /* Clear all status before transfer. */
  219. I2C_MasterClearStatusFlags(base, kClearFlags);
  220. /* If repeated start is requested, send repeated start. */
  221. if (handle->transfer.flags & kI2C_TransferRepeatedStartFlag)
  222. {
  223. result = I2C_MasterRepeatedStart(base, handle->transfer.slaveAddress, direction);
  224. }
  225. else /* For normal transfer, send start. */
  226. {
  227. result = I2C_MasterStart(base, handle->transfer.slaveAddress, direction);
  228. }
  229. return result;
  230. }
  231. static status_t I2C_CheckAndClearError(I2C_Type *base, uint32_t status)
  232. {
  233. status_t result = kStatus_Success;
  234. /* Check arbitration lost. */
  235. if (status & kI2C_ArbitrationLostFlag)
  236. {
  237. /* Clear arbitration lost flag. */
  238. base->S = kI2C_ArbitrationLostFlag;
  239. result = kStatus_I2C_ArbitrationLost;
  240. }
  241. /* Check NAK */
  242. else if (status & kI2C_ReceiveNakFlag)
  243. {
  244. result = kStatus_I2C_Nak;
  245. }
  246. else
  247. {
  248. }
  249. return result;
  250. }
  251. static status_t I2C_MasterTransferRunStateMachine(I2C_Type *base, i2c_master_handle_t *handle, bool *isDone)
  252. {
  253. status_t result = kStatus_Success;
  254. uint32_t statusFlags = base->S;
  255. *isDone = false;
  256. volatile uint8_t dummy = 0;
  257. bool ignoreNak = ((handle->state == kSendDataState) && (handle->transfer.dataSize == 0U)) ||
  258. ((handle->state == kReceiveDataState) && (handle->transfer.dataSize == 1U));
  259. /* Add this to avoid build warning. */
  260. dummy++;
  261. /* Check & clear error flags. */
  262. result = I2C_CheckAndClearError(base, statusFlags);
  263. /* Ignore Nak when it's appeared for last byte. */
  264. if ((result == kStatus_I2C_Nak) && ignoreNak)
  265. {
  266. result = kStatus_Success;
  267. }
  268. /* Handle Check address state to check the slave address is Acked in slave
  269. probe application. */
  270. if (handle->state == kCheckAddressState)
  271. {
  272. if (statusFlags & kI2C_ReceiveNakFlag)
  273. {
  274. result = kStatus_I2C_Addr_Nak;
  275. }
  276. else
  277. {
  278. if (handle->transfer.subaddressSize > 0)
  279. {
  280. handle->state = kSendCommandState;
  281. }
  282. else
  283. {
  284. if (handle->transfer.direction == kI2C_Write)
  285. {
  286. /* Next state, send data. */
  287. handle->state = kSendDataState;
  288. }
  289. else
  290. {
  291. /* Next state, receive data begin. */
  292. handle->state = kReceiveDataBeginState;
  293. }
  294. }
  295. }
  296. }
  297. if (result)
  298. {
  299. return result;
  300. }
  301. /* Run state machine. */
  302. switch (handle->state)
  303. {
  304. /* Send I2C command. */
  305. case kSendCommandState:
  306. if (handle->transfer.subaddressSize)
  307. {
  308. handle->transfer.subaddressSize--;
  309. base->D = ((handle->transfer.subaddress) >> (8 * handle->transfer.subaddressSize));
  310. }
  311. else
  312. {
  313. if (handle->transfer.direction == kI2C_Write)
  314. {
  315. /* Next state, send data. */
  316. handle->state = kSendDataState;
  317. /* Send first byte of data. */
  318. if (handle->transfer.dataSize > 0)
  319. {
  320. base->D = *handle->transfer.data;
  321. handle->transfer.data++;
  322. handle->transfer.dataSize--;
  323. }
  324. }
  325. else
  326. {
  327. /* Send repeated start and slave address. */
  328. result = I2C_MasterRepeatedStart(base, handle->transfer.slaveAddress, kI2C_Read);
  329. /* Next state, receive data begin. */
  330. handle->state = kReceiveDataBeginState;
  331. }
  332. }
  333. break;
  334. /* Send I2C data. */
  335. case kSendDataState:
  336. /* Send one byte of data. */
  337. if (handle->transfer.dataSize > 0)
  338. {
  339. base->D = *handle->transfer.data;
  340. handle->transfer.data++;
  341. handle->transfer.dataSize--;
  342. }
  343. else
  344. {
  345. *isDone = true;
  346. }
  347. break;
  348. /* Start I2C data receive. */
  349. case kReceiveDataBeginState:
  350. base->C1 &= ~(I2C_C1_TX_MASK | I2C_C1_TXAK_MASK);
  351. /* Send nak at the last receive byte. */
  352. if (handle->transfer.dataSize == 1)
  353. {
  354. base->C1 |= I2C_C1_TXAK_MASK;
  355. }
  356. /* Read dummy to release the bus. */
  357. dummy = base->D;
  358. /* Next state, receive data. */
  359. handle->state = kReceiveDataState;
  360. break;
  361. /* Receive I2C data. */
  362. case kReceiveDataState:
  363. /* Receive one byte of data. */
  364. if (handle->transfer.dataSize--)
  365. {
  366. if (handle->transfer.dataSize == 0)
  367. {
  368. *isDone = true;
  369. /* Send stop if kI2C_TransferNoStop is not asserted. */
  370. if (!(handle->transfer.flags & kI2C_TransferNoStopFlag))
  371. {
  372. result = I2C_MasterStop(base);
  373. }
  374. else
  375. {
  376. base->C1 |= I2C_C1_TX_MASK;
  377. }
  378. }
  379. /* Send NAK at the last receive byte. */
  380. if (handle->transfer.dataSize == 1)
  381. {
  382. base->C1 |= I2C_C1_TXAK_MASK;
  383. }
  384. /* Read the data byte into the transfer buffer. */
  385. *handle->transfer.data = base->D;
  386. handle->transfer.data++;
  387. }
  388. break;
  389. default:
  390. break;
  391. }
  392. return result;
  393. }
  394. static void I2C_TransferCommonIRQHandler(I2C_Type *base, void *handle)
  395. {
  396. /* Check if master interrupt. */
  397. if ((base->S & kI2C_ArbitrationLostFlag) || (base->C1 & I2C_C1_MST_MASK))
  398. {
  399. s_i2cMasterIsr(base, handle);
  400. }
  401. else
  402. {
  403. s_i2cSlaveIsr(base, handle);
  404. }
  405. __DSB();
  406. }
  407. void I2C_MasterInit(I2C_Type *base, const i2c_master_config_t *masterConfig, uint32_t srcClock_Hz)
  408. {
  409. assert(masterConfig && srcClock_Hz);
  410. /* Temporary register for filter read. */
  411. uint8_t fltReg;
  412. #if defined(FSL_FEATURE_I2C_HAS_DOUBLE_BUFFER_ENABLE) && FSL_FEATURE_I2C_HAS_DOUBLE_BUFFER_ENABLE
  413. uint8_t s2Reg;
  414. #endif
  415. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  416. /* Enable I2C clock. */
  417. CLOCK_EnableClock(s_i2cClocks[I2C_GetInstance(base)]);
  418. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  419. /* Reset the module. */
  420. base->A1 = 0;
  421. base->F = 0;
  422. base->C1 = 0;
  423. base->S = 0xFFU;
  424. base->C2 = 0;
  425. #if defined(FSL_FEATURE_I2C_HAS_START_STOP_DETECT) && FSL_FEATURE_I2C_HAS_START_STOP_DETECT
  426. base->FLT = 0x50U;
  427. #elif defined(FSL_FEATURE_I2C_HAS_STOP_DETECT) && FSL_FEATURE_I2C_HAS_STOP_DETECT
  428. base->FLT = 0x40U;
  429. #endif
  430. base->RA = 0;
  431. /* Disable I2C prior to configuring it. */
  432. base->C1 &= ~(I2C_C1_IICEN_MASK);
  433. /* Clear all flags. */
  434. I2C_MasterClearStatusFlags(base, kClearFlags);
  435. /* Configure baud rate. */
  436. I2C_MasterSetBaudRate(base, masterConfig->baudRate_Bps, srcClock_Hz);
  437. /* Read out the FLT register. */
  438. fltReg = base->FLT;
  439. #if defined(FSL_FEATURE_I2C_HAS_STOP_HOLD_OFF) && FSL_FEATURE_I2C_HAS_STOP_HOLD_OFF
  440. /* Configure the stop / hold enable. */
  441. fltReg &= ~(I2C_FLT_SHEN_MASK);
  442. fltReg |= I2C_FLT_SHEN(masterConfig->enableStopHold);
  443. #endif
  444. /* Configure the glitch filter value. */
  445. fltReg &= ~(I2C_FLT_FLT_MASK);
  446. fltReg |= I2C_FLT_FLT(masterConfig->glitchFilterWidth);
  447. /* Write the register value back to the filter register. */
  448. base->FLT = fltReg;
  449. /* Enable/Disable double buffering. */
  450. #if defined(FSL_FEATURE_I2C_HAS_DOUBLE_BUFFER_ENABLE) && FSL_FEATURE_I2C_HAS_DOUBLE_BUFFER_ENABLE
  451. s2Reg = base->S2 & (~I2C_S2_DFEN_MASK);
  452. base->S2 = s2Reg | I2C_S2_DFEN(masterConfig->enableDoubleBuffering);
  453. #endif
  454. /* Enable the I2C peripheral based on the configuration. */
  455. base->C1 = I2C_C1_IICEN(masterConfig->enableMaster);
  456. }
  457. void I2C_MasterDeinit(I2C_Type *base)
  458. {
  459. /* Disable I2C module. */
  460. I2C_Enable(base, false);
  461. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  462. /* Disable I2C clock. */
  463. CLOCK_DisableClock(s_i2cClocks[I2C_GetInstance(base)]);
  464. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  465. }
  466. void I2C_MasterGetDefaultConfig(i2c_master_config_t *masterConfig)
  467. {
  468. assert(masterConfig);
  469. /* Default baud rate at 100kbps. */
  470. masterConfig->baudRate_Bps = 100000U;
  471. /* Default stop hold enable is disabled. */
  472. #if defined(FSL_FEATURE_I2C_HAS_STOP_HOLD_OFF) && FSL_FEATURE_I2C_HAS_STOP_HOLD_OFF
  473. masterConfig->enableStopHold = false;
  474. #endif
  475. /* Default glitch filter value is no filter. */
  476. masterConfig->glitchFilterWidth = 0U;
  477. /* Default enable double buffering. */
  478. #if defined(FSL_FEATURE_I2C_HAS_DOUBLE_BUFFER_ENABLE) && FSL_FEATURE_I2C_HAS_DOUBLE_BUFFER_ENABLE
  479. masterConfig->enableDoubleBuffering = true;
  480. #endif
  481. /* Enable the I2C peripheral. */
  482. masterConfig->enableMaster = true;
  483. }
  484. void I2C_EnableInterrupts(I2C_Type *base, uint32_t mask)
  485. {
  486. #ifdef I2C_HAS_STOP_DETECT
  487. uint8_t fltReg;
  488. #endif
  489. if (mask & kI2C_GlobalInterruptEnable)
  490. {
  491. base->C1 |= I2C_C1_IICIE_MASK;
  492. }
  493. #if defined(FSL_FEATURE_I2C_HAS_STOP_DETECT) && FSL_FEATURE_I2C_HAS_STOP_DETECT
  494. if (mask & kI2C_StopDetectInterruptEnable)
  495. {
  496. fltReg = base->FLT;
  497. /* Keep STOPF flag. */
  498. fltReg &= ~I2C_FLT_STOPF_MASK;
  499. /* Stop detect enable. */
  500. fltReg |= I2C_FLT_STOPIE_MASK;
  501. base->FLT = fltReg;
  502. }
  503. #endif /* FSL_FEATURE_I2C_HAS_STOP_DETECT */
  504. #if defined(FSL_FEATURE_I2C_HAS_START_STOP_DETECT) && FSL_FEATURE_I2C_HAS_START_STOP_DETECT
  505. if (mask & kI2C_StartStopDetectInterruptEnable)
  506. {
  507. fltReg = base->FLT;
  508. /* Keep STARTF and STOPF flags. */
  509. fltReg &= ~(I2C_FLT_STOPF_MASK | I2C_FLT_STARTF_MASK);
  510. /* Start and stop detect enable. */
  511. fltReg |= I2C_FLT_SSIE_MASK;
  512. base->FLT = fltReg;
  513. }
  514. #endif /* FSL_FEATURE_I2C_HAS_START_STOP_DETECT */
  515. }
  516. void I2C_DisableInterrupts(I2C_Type *base, uint32_t mask)
  517. {
  518. if (mask & kI2C_GlobalInterruptEnable)
  519. {
  520. base->C1 &= ~I2C_C1_IICIE_MASK;
  521. }
  522. #if defined(FSL_FEATURE_I2C_HAS_STOP_DETECT) && FSL_FEATURE_I2C_HAS_STOP_DETECT
  523. if (mask & kI2C_StopDetectInterruptEnable)
  524. {
  525. base->FLT &= ~(I2C_FLT_STOPIE_MASK | I2C_FLT_STOPF_MASK);
  526. }
  527. #endif /* FSL_FEATURE_I2C_HAS_STOP_DETECT */
  528. #if defined(FSL_FEATURE_I2C_HAS_START_STOP_DETECT) && FSL_FEATURE_I2C_HAS_START_STOP_DETECT
  529. if (mask & kI2C_StartStopDetectInterruptEnable)
  530. {
  531. base->FLT &= ~(I2C_FLT_SSIE_MASK | I2C_FLT_STOPF_MASK | I2C_FLT_STARTF_MASK);
  532. }
  533. #endif /* FSL_FEATURE_I2C_HAS_START_STOP_DETECT */
  534. }
  535. void I2C_MasterSetBaudRate(I2C_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz)
  536. {
  537. uint32_t multiplier;
  538. uint32_t computedRate;
  539. uint32_t absError;
  540. uint32_t bestError = UINT32_MAX;
  541. uint32_t bestMult = 0u;
  542. uint32_t bestIcr = 0u;
  543. uint8_t mult;
  544. uint8_t i;
  545. /* Search for the settings with the lowest error. Mult is the MULT field of the I2C_F register,
  546. * and ranges from 0-2. It selects the multiplier factor for the divider. */
  547. for (mult = 0u; (mult <= 2u) && (bestError != 0); ++mult)
  548. {
  549. multiplier = 1u << mult;
  550. /* Scan table to find best match. */
  551. for (i = 0u; i < sizeof(s_i2cDividerTable) / sizeof(uint16_t); ++i)
  552. {
  553. computedRate = srcClock_Hz / (multiplier * s_i2cDividerTable[i]);
  554. absError = baudRate_Bps > computedRate ? (baudRate_Bps - computedRate) : (computedRate - baudRate_Bps);
  555. if (absError < bestError)
  556. {
  557. bestMult = mult;
  558. bestIcr = i;
  559. bestError = absError;
  560. /* If the error is 0, then we can stop searching because we won't find a better match. */
  561. if (absError == 0)
  562. {
  563. break;
  564. }
  565. }
  566. }
  567. }
  568. /* Set frequency register based on best settings. */
  569. base->F = I2C_F_MULT(bestMult) | I2C_F_ICR(bestIcr);
  570. }
  571. status_t I2C_MasterStart(I2C_Type *base, uint8_t address, i2c_direction_t direction)
  572. {
  573. status_t result = kStatus_Success;
  574. uint32_t statusFlags = I2C_MasterGetStatusFlags(base);
  575. /* Return an error if the bus is already in use. */
  576. if (statusFlags & kI2C_BusBusyFlag)
  577. {
  578. result = kStatus_I2C_Busy;
  579. }
  580. else
  581. {
  582. /* Send the START signal. */
  583. base->C1 |= I2C_C1_MST_MASK | I2C_C1_TX_MASK;
  584. #if defined(FSL_FEATURE_I2C_HAS_DOUBLE_BUFFERING) && FSL_FEATURE_I2C_HAS_DOUBLE_BUFFERING
  585. while (!(base->S2 & I2C_S2_EMPTY_MASK))
  586. {
  587. }
  588. #endif /* FSL_FEATURE_I2C_HAS_DOUBLE_BUFFERING */
  589. base->D = (((uint32_t)address) << 1U | ((direction == kI2C_Read) ? 1U : 0U));
  590. }
  591. return result;
  592. }
  593. status_t I2C_MasterRepeatedStart(I2C_Type *base, uint8_t address, i2c_direction_t direction)
  594. {
  595. status_t result = kStatus_Success;
  596. uint8_t savedMult;
  597. uint32_t statusFlags = I2C_MasterGetStatusFlags(base);
  598. uint8_t timeDelay = 6;
  599. /* Return an error if the bus is already in use, but not by us. */
  600. if ((statusFlags & kI2C_BusBusyFlag) && ((base->C1 & I2C_C1_MST_MASK) == 0))
  601. {
  602. result = kStatus_I2C_Busy;
  603. }
  604. else
  605. {
  606. savedMult = base->F;
  607. base->F = savedMult & (~I2C_F_MULT_MASK);
  608. /* We are already in a transfer, so send a repeated start. */
  609. base->C1 |= I2C_C1_RSTA_MASK | I2C_C1_TX_MASK;
  610. /* Restore the multiplier factor. */
  611. base->F = savedMult;
  612. /* Add some delay to wait the Re-Start signal. */
  613. while (timeDelay--)
  614. {
  615. __NOP();
  616. }
  617. #if defined(FSL_FEATURE_I2C_HAS_DOUBLE_BUFFERING) && FSL_FEATURE_I2C_HAS_DOUBLE_BUFFERING
  618. while (!(base->S2 & I2C_S2_EMPTY_MASK))
  619. {
  620. }
  621. #endif /* FSL_FEATURE_I2C_HAS_DOUBLE_BUFFERING */
  622. base->D = (((uint32_t)address) << 1U | ((direction == kI2C_Read) ? 1U : 0U));
  623. }
  624. return result;
  625. }
  626. status_t I2C_MasterStop(I2C_Type *base)
  627. {
  628. status_t result = kStatus_Success;
  629. uint16_t timeout = UINT16_MAX;
  630. /* Issue the STOP command on the bus. */
  631. base->C1 &= ~(I2C_C1_MST_MASK | I2C_C1_TX_MASK | I2C_C1_TXAK_MASK);
  632. /* Wait until data transfer complete. */
  633. while ((base->S & kI2C_BusBusyFlag) && (--timeout))
  634. {
  635. }
  636. if (timeout == 0)
  637. {
  638. result = kStatus_I2C_Timeout;
  639. }
  640. return result;
  641. }
  642. uint32_t I2C_MasterGetStatusFlags(I2C_Type *base)
  643. {
  644. uint32_t statusFlags = base->S;
  645. #ifdef I2C_HAS_STOP_DETECT
  646. /* Look up the STOPF bit from the filter register. */
  647. if (base->FLT & I2C_FLT_STOPF_MASK)
  648. {
  649. statusFlags |= kI2C_StopDetectFlag;
  650. }
  651. #endif
  652. #if defined(FSL_FEATURE_I2C_HAS_START_STOP_DETECT) && FSL_FEATURE_I2C_HAS_START_STOP_DETECT
  653. /* Look up the STARTF bit from the filter register. */
  654. if (base->FLT & I2C_FLT_STARTF_MASK)
  655. {
  656. statusFlags |= kI2C_StartDetectFlag;
  657. }
  658. #endif /* FSL_FEATURE_I2C_HAS_START_STOP_DETECT */
  659. return statusFlags;
  660. }
  661. status_t I2C_MasterWriteBlocking(I2C_Type *base, const uint8_t *txBuff, size_t txSize, uint32_t flags)
  662. {
  663. status_t result = kStatus_Success;
  664. uint8_t statusFlags = 0;
  665. /* Wait until the data register is ready for transmit. */
  666. while (!(base->S & kI2C_TransferCompleteFlag))
  667. {
  668. }
  669. /* Clear the IICIF flag. */
  670. base->S = kI2C_IntPendingFlag;
  671. /* Setup the I2C peripheral to transmit data. */
  672. base->C1 |= I2C_C1_TX_MASK;
  673. while (txSize--)
  674. {
  675. /* Send a byte of data. */
  676. base->D = *txBuff++;
  677. /* Wait until data transfer complete. */
  678. while (!(base->S & kI2C_IntPendingFlag))
  679. {
  680. }
  681. statusFlags = base->S;
  682. /* Clear the IICIF flag. */
  683. base->S = kI2C_IntPendingFlag;
  684. /* Check if arbitration lost or no acknowledgement (NAK), return failure status. */
  685. if (statusFlags & kI2C_ArbitrationLostFlag)
  686. {
  687. base->S = kI2C_ArbitrationLostFlag;
  688. result = kStatus_I2C_ArbitrationLost;
  689. }
  690. if ((statusFlags & kI2C_ReceiveNakFlag) && txSize)
  691. {
  692. base->S = kI2C_ReceiveNakFlag;
  693. result = kStatus_I2C_Nak;
  694. }
  695. if (result != kStatus_Success)
  696. {
  697. /* Breaking out of the send loop. */
  698. break;
  699. }
  700. }
  701. if (((result == kStatus_Success) && (!(flags & kI2C_TransferNoStopFlag))) || (result == kStatus_I2C_Nak))
  702. {
  703. /* Clear the IICIF flag. */
  704. base->S = kI2C_IntPendingFlag;
  705. /* Send stop. */
  706. result = I2C_MasterStop(base);
  707. }
  708. return result;
  709. }
  710. status_t I2C_MasterReadBlocking(I2C_Type *base, uint8_t *rxBuff, size_t rxSize, uint32_t flags)
  711. {
  712. status_t result = kStatus_Success;
  713. volatile uint8_t dummy = 0;
  714. /* Add this to avoid build warning. */
  715. dummy++;
  716. /* Wait until the data register is ready for transmit. */
  717. while (!(base->S & kI2C_TransferCompleteFlag))
  718. {
  719. }
  720. /* Clear the IICIF flag. */
  721. base->S = kI2C_IntPendingFlag;
  722. /* Setup the I2C peripheral to receive data. */
  723. base->C1 &= ~(I2C_C1_TX_MASK | I2C_C1_TXAK_MASK);
  724. /* If rxSize equals 1, configure to send NAK. */
  725. if (rxSize == 1)
  726. {
  727. /* Issue NACK on read. */
  728. base->C1 |= I2C_C1_TXAK_MASK;
  729. }
  730. /* Do dummy read. */
  731. dummy = base->D;
  732. while ((rxSize--))
  733. {
  734. /* Wait until data transfer complete. */
  735. while (!(base->S & kI2C_IntPendingFlag))
  736. {
  737. }
  738. /* Clear the IICIF flag. */
  739. base->S = kI2C_IntPendingFlag;
  740. /* Single byte use case. */
  741. if (rxSize == 0)
  742. {
  743. if (!(flags & kI2C_TransferNoStopFlag))
  744. {
  745. /* Issue STOP command before reading last byte. */
  746. result = I2C_MasterStop(base);
  747. }
  748. else
  749. {
  750. /* Change direction to Tx to avoid extra clocks. */
  751. base->C1 |= I2C_C1_TX_MASK;
  752. }
  753. }
  754. if (rxSize == 1)
  755. {
  756. /* Issue NACK on read. */
  757. base->C1 |= I2C_C1_TXAK_MASK;
  758. }
  759. /* Read from the data register. */
  760. *rxBuff++ = base->D;
  761. }
  762. return result;
  763. }
  764. status_t I2C_MasterTransferBlocking(I2C_Type *base, i2c_master_transfer_t *xfer)
  765. {
  766. assert(xfer);
  767. i2c_direction_t direction = xfer->direction;
  768. status_t result = kStatus_Success;
  769. /* Clear all status before transfer. */
  770. I2C_MasterClearStatusFlags(base, kClearFlags);
  771. /* Wait until ready to complete. */
  772. while (!(base->S & kI2C_TransferCompleteFlag))
  773. {
  774. }
  775. /* Change to send write address when it's a read operation with command. */
  776. if ((xfer->subaddressSize > 0) && (xfer->direction == kI2C_Read))
  777. {
  778. direction = kI2C_Write;
  779. }
  780. /* If repeated start is requested, send repeated start. */
  781. if (xfer->flags & kI2C_TransferRepeatedStartFlag)
  782. {
  783. result = I2C_MasterRepeatedStart(base, xfer->slaveAddress, direction);
  784. }
  785. else /* For normal transfer, send start. */
  786. {
  787. result = I2C_MasterStart(base, xfer->slaveAddress, direction);
  788. }
  789. /* Return if error. */
  790. if (result)
  791. {
  792. return result;
  793. }
  794. while (!(base->S & kI2C_IntPendingFlag))
  795. {
  796. }
  797. /* Check if there's transfer error. */
  798. result = I2C_CheckAndClearError(base, base->S);
  799. /* Return if error. */
  800. if (result)
  801. {
  802. if (result == kStatus_I2C_Nak)
  803. {
  804. result = kStatus_I2C_Addr_Nak;
  805. I2C_MasterStop(base);
  806. }
  807. return result;
  808. }
  809. /* Send subaddress. */
  810. if (xfer->subaddressSize)
  811. {
  812. do
  813. {
  814. /* Clear interrupt pending flag. */
  815. base->S = kI2C_IntPendingFlag;
  816. xfer->subaddressSize--;
  817. base->D = ((xfer->subaddress) >> (8 * xfer->subaddressSize));
  818. /* Wait until data transfer complete. */
  819. while (!(base->S & kI2C_IntPendingFlag))
  820. {
  821. }
  822. /* Check if there's transfer error. */
  823. result = I2C_CheckAndClearError(base, base->S);
  824. if (result)
  825. {
  826. if (result == kStatus_I2C_Nak)
  827. {
  828. I2C_MasterStop(base);
  829. }
  830. return result;
  831. }
  832. } while ((xfer->subaddressSize > 0) && (result == kStatus_Success));
  833. if (xfer->direction == kI2C_Read)
  834. {
  835. /* Clear pending flag. */
  836. base->S = kI2C_IntPendingFlag;
  837. /* Send repeated start and slave address. */
  838. result = I2C_MasterRepeatedStart(base, xfer->slaveAddress, kI2C_Read);
  839. /* Return if error. */
  840. if (result)
  841. {
  842. return result;
  843. }
  844. /* Wait until data transfer complete. */
  845. while (!(base->S & kI2C_IntPendingFlag))
  846. {
  847. }
  848. /* Check if there's transfer error. */
  849. result = I2C_CheckAndClearError(base, base->S);
  850. if (result)
  851. {
  852. if (result == kStatus_I2C_Nak)
  853. {
  854. result = kStatus_I2C_Addr_Nak;
  855. I2C_MasterStop(base);
  856. }
  857. return result;
  858. }
  859. }
  860. }
  861. /* Transmit data. */
  862. if ((xfer->direction == kI2C_Write) && (xfer->dataSize > 0))
  863. {
  864. /* Send Data. */
  865. result = I2C_MasterWriteBlocking(base, xfer->data, xfer->dataSize, xfer->flags);
  866. }
  867. /* Receive Data. */
  868. if ((xfer->direction == kI2C_Read) && (xfer->dataSize > 0))
  869. {
  870. result = I2C_MasterReadBlocking(base, xfer->data, xfer->dataSize, xfer->flags);
  871. }
  872. return result;
  873. }
  874. void I2C_MasterTransferCreateHandle(I2C_Type *base,
  875. i2c_master_handle_t *handle,
  876. i2c_master_transfer_callback_t callback,
  877. void *userData)
  878. {
  879. assert(handle);
  880. uint32_t instance = I2C_GetInstance(base);
  881. /* Zero handle. */
  882. memset(handle, 0, sizeof(*handle));
  883. /* Set callback and userData. */
  884. handle->completionCallback = callback;
  885. handle->userData = userData;
  886. /* Save the context in global variables to support the double weak mechanism. */
  887. s_i2cHandle[instance] = handle;
  888. /* Save master interrupt handler. */
  889. s_i2cMasterIsr = I2C_MasterTransferHandleIRQ;
  890. /* Enable NVIC interrupt. */
  891. EnableIRQ(s_i2cIrqs[instance]);
  892. }
  893. status_t I2C_MasterTransferNonBlocking(I2C_Type *base, i2c_master_handle_t *handle, i2c_master_transfer_t *xfer)
  894. {
  895. assert(handle);
  896. assert(xfer);
  897. status_t result = kStatus_Success;
  898. /* Check if the I2C bus is idle - if not return busy status. */
  899. if (handle->state != kIdleState)
  900. {
  901. result = kStatus_I2C_Busy;
  902. }
  903. else
  904. {
  905. /* Start up the master transfer state machine. */
  906. result = I2C_InitTransferStateMachine(base, handle, xfer);
  907. if (result == kStatus_Success)
  908. {
  909. /* Enable the I2C interrupts. */
  910. I2C_EnableInterrupts(base, kI2C_GlobalInterruptEnable);
  911. }
  912. }
  913. return result;
  914. }
  915. void I2C_MasterTransferAbort(I2C_Type *base, i2c_master_handle_t *handle)
  916. {
  917. assert(handle);
  918. volatile uint8_t dummy = 0;
  919. /* Add this to avoid build warning. */
  920. dummy++;
  921. /* Disable interrupt. */
  922. I2C_DisableInterrupts(base, kI2C_GlobalInterruptEnable);
  923. /* Reset the state to idle. */
  924. handle->state = kIdleState;
  925. /* Send STOP signal. */
  926. if (handle->transfer.direction == kI2C_Read)
  927. {
  928. base->C1 |= I2C_C1_TXAK_MASK;
  929. while (!(base->S & kI2C_IntPendingFlag))
  930. {
  931. }
  932. base->S = kI2C_IntPendingFlag;
  933. base->C1 &= ~(I2C_C1_MST_MASK | I2C_C1_TX_MASK | I2C_C1_TXAK_MASK);
  934. dummy = base->D;
  935. }
  936. else
  937. {
  938. while (!(base->S & kI2C_IntPendingFlag))
  939. {
  940. }
  941. base->S = kI2C_IntPendingFlag;
  942. base->C1 &= ~(I2C_C1_MST_MASK | I2C_C1_TX_MASK | I2C_C1_TXAK_MASK);
  943. }
  944. }
  945. status_t I2C_MasterTransferGetCount(I2C_Type *base, i2c_master_handle_t *handle, size_t *count)
  946. {
  947. assert(handle);
  948. if (!count)
  949. {
  950. return kStatus_InvalidArgument;
  951. }
  952. *count = handle->transferSize - handle->transfer.dataSize;
  953. return kStatus_Success;
  954. }
  955. void I2C_MasterTransferHandleIRQ(I2C_Type *base, void *i2cHandle)
  956. {
  957. assert(i2cHandle);
  958. i2c_master_handle_t *handle = (i2c_master_handle_t *)i2cHandle;
  959. status_t result = kStatus_Success;
  960. bool isDone;
  961. /* Clear the interrupt flag. */
  962. base->S = kI2C_IntPendingFlag;
  963. /* Check transfer complete flag. */
  964. result = I2C_MasterTransferRunStateMachine(base, handle, &isDone);
  965. if (isDone || result)
  966. {
  967. /* Send stop command if transfer done or received Nak. */
  968. if ((!(handle->transfer.flags & kI2C_TransferNoStopFlag)) || (result == kStatus_I2C_Nak) ||
  969. (result == kStatus_I2C_Addr_Nak))
  970. {
  971. /* Ensure stop command is a need. */
  972. if ((base->C1 & I2C_C1_MST_MASK))
  973. {
  974. if (I2C_MasterStop(base) != kStatus_Success)
  975. {
  976. result = kStatus_I2C_Timeout;
  977. }
  978. }
  979. }
  980. /* Restore handle to idle state. */
  981. handle->state = kIdleState;
  982. /* Disable interrupt. */
  983. I2C_DisableInterrupts(base, kI2C_GlobalInterruptEnable);
  984. /* Call the callback function after the function has completed. */
  985. if (handle->completionCallback)
  986. {
  987. handle->completionCallback(base, handle, result, handle->userData);
  988. }
  989. }
  990. }
  991. void I2C_SlaveInit(I2C_Type *base, const i2c_slave_config_t *slaveConfig, uint32_t srcClock_Hz)
  992. {
  993. assert(slaveConfig);
  994. uint8_t tmpReg;
  995. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  996. CLOCK_EnableClock(s_i2cClocks[I2C_GetInstance(base)]);
  997. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  998. /* Reset the module. */
  999. base->A1 = 0;
  1000. base->F = 0;
  1001. base->C1 = 0;
  1002. base->S = 0xFFU;
  1003. base->C2 = 0;
  1004. #if defined(FSL_FEATURE_I2C_HAS_START_STOP_DETECT) && FSL_FEATURE_I2C_HAS_START_STOP_DETECT
  1005. base->FLT = 0x50U;
  1006. #elif defined(FSL_FEATURE_I2C_HAS_STOP_DETECT) && FSL_FEATURE_I2C_HAS_STOP_DETECT
  1007. base->FLT = 0x40U;
  1008. #endif
  1009. base->RA = 0;
  1010. /* Configure addressing mode. */
  1011. switch (slaveConfig->addressingMode)
  1012. {
  1013. case kI2C_Address7bit:
  1014. base->A1 = ((uint32_t)(slaveConfig->slaveAddress)) << 1U;
  1015. break;
  1016. case kI2C_RangeMatch:
  1017. assert(slaveConfig->slaveAddress < slaveConfig->upperAddress);
  1018. base->A1 = ((uint32_t)(slaveConfig->slaveAddress)) << 1U;
  1019. base->RA = ((uint32_t)(slaveConfig->upperAddress)) << 1U;
  1020. base->C2 |= I2C_C2_RMEN_MASK;
  1021. break;
  1022. default:
  1023. break;
  1024. }
  1025. /* Configure low power wake up feature. */
  1026. tmpReg = base->C1;
  1027. tmpReg &= ~I2C_C1_WUEN_MASK;
  1028. base->C1 = tmpReg | I2C_C1_WUEN(slaveConfig->enableWakeUp) | I2C_C1_IICEN(slaveConfig->enableSlave);
  1029. /* Configure general call & baud rate control. */
  1030. tmpReg = base->C2;
  1031. tmpReg &= ~(I2C_C2_SBRC_MASK | I2C_C2_GCAEN_MASK);
  1032. tmpReg |= I2C_C2_SBRC(slaveConfig->enableBaudRateCtl) | I2C_C2_GCAEN(slaveConfig->enableGeneralCall);
  1033. base->C2 = tmpReg;
  1034. /* Enable/Disable double buffering. */
  1035. #if defined(FSL_FEATURE_I2C_HAS_DOUBLE_BUFFER_ENABLE) && FSL_FEATURE_I2C_HAS_DOUBLE_BUFFER_ENABLE
  1036. tmpReg = base->S2 & (~I2C_S2_DFEN_MASK);
  1037. base->S2 = tmpReg | I2C_S2_DFEN(slaveConfig->enableDoubleBuffering);
  1038. #endif
  1039. /* Set hold time. */
  1040. I2C_SetHoldTime(base, slaveConfig->sclStopHoldTime_ns, srcClock_Hz);
  1041. }
  1042. void I2C_SlaveDeinit(I2C_Type *base)
  1043. {
  1044. /* Disable I2C module. */
  1045. I2C_Enable(base, false);
  1046. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  1047. /* Disable I2C clock. */
  1048. CLOCK_DisableClock(s_i2cClocks[I2C_GetInstance(base)]);
  1049. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  1050. }
  1051. void I2C_SlaveGetDefaultConfig(i2c_slave_config_t *slaveConfig)
  1052. {
  1053. assert(slaveConfig);
  1054. /* By default slave is addressed with 7-bit address. */
  1055. slaveConfig->addressingMode = kI2C_Address7bit;
  1056. /* General call mode is disabled by default. */
  1057. slaveConfig->enableGeneralCall = false;
  1058. /* Slave address match waking up MCU from low power mode is disabled. */
  1059. slaveConfig->enableWakeUp = false;
  1060. /* Independent slave mode baud rate at maximum frequency is disabled. */
  1061. slaveConfig->enableBaudRateCtl = false;
  1062. /* Default enable double buffering. */
  1063. #if defined(FSL_FEATURE_I2C_HAS_DOUBLE_BUFFER_ENABLE) && FSL_FEATURE_I2C_HAS_DOUBLE_BUFFER_ENABLE
  1064. slaveConfig->enableDoubleBuffering = true;
  1065. #endif
  1066. /* Set default SCL stop hold time to 4us which is minimum requirement in I2C spec. */
  1067. slaveConfig->sclStopHoldTime_ns = 4000;
  1068. /* Enable the I2C peripheral. */
  1069. slaveConfig->enableSlave = true;
  1070. }
  1071. status_t I2C_SlaveWriteBlocking(I2C_Type *base, const uint8_t *txBuff, size_t txSize)
  1072. {
  1073. status_t result = kStatus_Success;
  1074. volatile uint8_t dummy = 0;
  1075. /* Add this to avoid build warning. */
  1076. dummy++;
  1077. #if defined(FSL_FEATURE_I2C_HAS_START_STOP_DETECT) && FSL_FEATURE_I2C_HAS_START_STOP_DETECT
  1078. /* Check start flag. */
  1079. while (!(base->FLT & I2C_FLT_STARTF_MASK))
  1080. {
  1081. }
  1082. /* Clear STARTF flag. */
  1083. base->FLT |= I2C_FLT_STARTF_MASK;
  1084. /* Clear the IICIF flag. */
  1085. base->S = kI2C_IntPendingFlag;
  1086. #endif /* FSL_FEATURE_I2C_HAS_START_STOP_DETECT */
  1087. /* Wait for address match flag. */
  1088. while (!(base->S & kI2C_AddressMatchFlag))
  1089. {
  1090. }
  1091. /* Read dummy to release bus. */
  1092. dummy = base->D;
  1093. result = I2C_MasterWriteBlocking(base, txBuff, txSize, kI2C_TransferDefaultFlag);
  1094. /* Switch to receive mode. */
  1095. base->C1 &= ~(I2C_C1_TX_MASK | I2C_C1_TXAK_MASK);
  1096. /* Read dummy to release bus. */
  1097. dummy = base->D;
  1098. return result;
  1099. }
  1100. void I2C_SlaveReadBlocking(I2C_Type *base, uint8_t *rxBuff, size_t rxSize)
  1101. {
  1102. volatile uint8_t dummy = 0;
  1103. /* Add this to avoid build warning. */
  1104. dummy++;
  1105. /* Wait until address match. */
  1106. #if defined(FSL_FEATURE_I2C_HAS_START_STOP_DETECT) && FSL_FEATURE_I2C_HAS_START_STOP_DETECT
  1107. /* Check start flag. */
  1108. while (!(base->FLT & I2C_FLT_STARTF_MASK))
  1109. {
  1110. }
  1111. /* Clear STARTF flag. */
  1112. base->FLT |= I2C_FLT_STARTF_MASK;
  1113. /* Clear the IICIF flag. */
  1114. base->S = kI2C_IntPendingFlag;
  1115. #endif /* FSL_FEATURE_I2C_HAS_START_STOP_DETECT */
  1116. /* Wait for address match and int pending flag. */
  1117. while (!(base->S & kI2C_AddressMatchFlag))
  1118. {
  1119. }
  1120. while (!(base->S & kI2C_IntPendingFlag))
  1121. {
  1122. }
  1123. /* Read dummy to release bus. */
  1124. dummy = base->D;
  1125. /* Clear the IICIF flag. */
  1126. base->S = kI2C_IntPendingFlag;
  1127. /* Setup the I2C peripheral to receive data. */
  1128. base->C1 &= ~(I2C_C1_TX_MASK);
  1129. while (rxSize--)
  1130. {
  1131. /* Wait until data transfer complete. */
  1132. while (!(base->S & kI2C_IntPendingFlag))
  1133. {
  1134. }
  1135. /* Clear the IICIF flag. */
  1136. base->S = kI2C_IntPendingFlag;
  1137. /* Read from the data register. */
  1138. *rxBuff++ = base->D;
  1139. }
  1140. }
  1141. void I2C_SlaveTransferCreateHandle(I2C_Type *base,
  1142. i2c_slave_handle_t *handle,
  1143. i2c_slave_transfer_callback_t callback,
  1144. void *userData)
  1145. {
  1146. assert(handle);
  1147. uint32_t instance = I2C_GetInstance(base);
  1148. /* Zero handle. */
  1149. memset(handle, 0, sizeof(*handle));
  1150. /* Set callback and userData. */
  1151. handle->callback = callback;
  1152. handle->userData = userData;
  1153. /* Save the context in global variables to support the double weak mechanism. */
  1154. s_i2cHandle[instance] = handle;
  1155. /* Save slave interrupt handler. */
  1156. s_i2cSlaveIsr = I2C_SlaveTransferHandleIRQ;
  1157. /* Enable NVIC interrupt. */
  1158. EnableIRQ(s_i2cIrqs[instance]);
  1159. }
  1160. status_t I2C_SlaveTransferNonBlocking(I2C_Type *base, i2c_slave_handle_t *handle, uint32_t eventMask)
  1161. {
  1162. assert(handle);
  1163. /* Check if the I2C bus is idle - if not return busy status. */
  1164. if (handle->isBusy)
  1165. {
  1166. return kStatus_I2C_Busy;
  1167. }
  1168. else
  1169. {
  1170. /* Disable LPI2C IRQ sources while we configure stuff. */
  1171. I2C_DisableInterrupts(base, kIrqFlags);
  1172. /* Clear transfer in handle. */
  1173. memset(&handle->transfer, 0, sizeof(handle->transfer));
  1174. /* Record that we're busy. */
  1175. handle->isBusy = true;
  1176. /* Set up event mask. tx and rx are always enabled. */
  1177. handle->eventMask = eventMask | kI2C_SlaveTransmitEvent | kI2C_SlaveReceiveEvent | kI2C_SlaveGenaralcallEvent;
  1178. /* Clear all flags. */
  1179. I2C_SlaveClearStatusFlags(base, kClearFlags);
  1180. /* Enable I2C internal IRQ sources. NVIC IRQ was enabled in CreateHandle() */
  1181. I2C_EnableInterrupts(base, kIrqFlags);
  1182. }
  1183. return kStatus_Success;
  1184. }
  1185. void I2C_SlaveTransferAbort(I2C_Type *base, i2c_slave_handle_t *handle)
  1186. {
  1187. assert(handle);
  1188. if (handle->isBusy)
  1189. {
  1190. /* Disable interrupts. */
  1191. I2C_DisableInterrupts(base, kIrqFlags);
  1192. /* Reset transfer info. */
  1193. memset(&handle->transfer, 0, sizeof(handle->transfer));
  1194. /* Reset the state to idle. */
  1195. handle->isBusy = false;
  1196. }
  1197. }
  1198. status_t I2C_SlaveTransferGetCount(I2C_Type *base, i2c_slave_handle_t *handle, size_t *count)
  1199. {
  1200. assert(handle);
  1201. if (!count)
  1202. {
  1203. return kStatus_InvalidArgument;
  1204. }
  1205. /* Catch when there is not an active transfer. */
  1206. if (!handle->isBusy)
  1207. {
  1208. *count = 0;
  1209. return kStatus_NoTransferInProgress;
  1210. }
  1211. /* For an active transfer, just return the count from the handle. */
  1212. *count = handle->transfer.transferredCount;
  1213. return kStatus_Success;
  1214. }
  1215. void I2C_SlaveTransferHandleIRQ(I2C_Type *base, void *i2cHandle)
  1216. {
  1217. assert(i2cHandle);
  1218. uint16_t status;
  1219. bool doTransmit = false;
  1220. i2c_slave_handle_t *handle = (i2c_slave_handle_t *)i2cHandle;
  1221. i2c_slave_transfer_t *xfer;
  1222. volatile uint8_t dummy = 0;
  1223. /* Add this to avoid build warning. */
  1224. dummy++;
  1225. status = I2C_SlaveGetStatusFlags(base);
  1226. xfer = &(handle->transfer);
  1227. #ifdef I2C_HAS_STOP_DETECT
  1228. /* Check stop flag. */
  1229. if (status & kI2C_StopDetectFlag)
  1230. {
  1231. I2C_MasterClearStatusFlags(base, kI2C_StopDetectFlag);
  1232. /* Clear the interrupt flag. */
  1233. base->S = kI2C_IntPendingFlag;
  1234. /* Call slave callback if this is the STOP of the transfer. */
  1235. if (handle->isBusy)
  1236. {
  1237. xfer->event = kI2C_SlaveCompletionEvent;
  1238. xfer->completionStatus = kStatus_Success;
  1239. handle->isBusy = false;
  1240. if ((handle->eventMask & xfer->event) && (handle->callback))
  1241. {
  1242. handle->callback(base, xfer, handle->userData);
  1243. }
  1244. }
  1245. if (!(status & kI2C_AddressMatchFlag))
  1246. {
  1247. return;
  1248. }
  1249. }
  1250. #endif /* I2C_HAS_STOP_DETECT */
  1251. #if defined(FSL_FEATURE_I2C_HAS_START_STOP_DETECT) && FSL_FEATURE_I2C_HAS_START_STOP_DETECT
  1252. /* Check start flag. */
  1253. if (status & kI2C_StartDetectFlag)
  1254. {
  1255. I2C_MasterClearStatusFlags(base, kI2C_StartDetectFlag);
  1256. /* Clear the interrupt flag. */
  1257. base->S = kI2C_IntPendingFlag;
  1258. xfer->event = kI2C_SlaveStartEvent;
  1259. if ((handle->eventMask & xfer->event) && (handle->callback))
  1260. {
  1261. handle->callback(base, xfer, handle->userData);
  1262. }
  1263. if (!(status & kI2C_AddressMatchFlag))
  1264. {
  1265. return;
  1266. }
  1267. }
  1268. #endif /* FSL_FEATURE_I2C_HAS_START_STOP_DETECT */
  1269. /* Clear the interrupt flag. */
  1270. base->S = kI2C_IntPendingFlag;
  1271. /* Check NAK */
  1272. if (status & kI2C_ReceiveNakFlag)
  1273. {
  1274. /* Set receive mode. */
  1275. base->C1 &= ~(I2C_C1_TX_MASK | I2C_C1_TXAK_MASK);
  1276. /* Read dummy. */
  1277. dummy = base->D;
  1278. if (handle->transfer.dataSize != 0)
  1279. {
  1280. xfer->event = kI2C_SlaveCompletionEvent;
  1281. xfer->completionStatus = kStatus_I2C_Nak;
  1282. handle->isBusy = false;
  1283. if ((handle->eventMask & xfer->event) && (handle->callback))
  1284. {
  1285. handle->callback(base, xfer, handle->userData);
  1286. }
  1287. }
  1288. else
  1289. {
  1290. #ifndef I2C_HAS_STOP_DETECT
  1291. xfer->event = kI2C_SlaveCompletionEvent;
  1292. xfer->completionStatus = kStatus_Success;
  1293. handle->isBusy = false;
  1294. if ((handle->eventMask & xfer->event) && (handle->callback))
  1295. {
  1296. handle->callback(base, xfer, handle->userData);
  1297. }
  1298. #endif /* !FSL_FEATURE_I2C_HAS_START_STOP_DETECT or !FSL_FEATURE_I2C_HAS_STOP_DETECT */
  1299. }
  1300. }
  1301. /* Check address match. */
  1302. else if (status & kI2C_AddressMatchFlag)
  1303. {
  1304. handle->isBusy = true;
  1305. xfer->event = kI2C_SlaveAddressMatchEvent;
  1306. /* Slave transmit, master reading from slave. */
  1307. if (status & kI2C_TransferDirectionFlag)
  1308. {
  1309. /* Change direction to send data. */
  1310. base->C1 |= I2C_C1_TX_MASK;
  1311. doTransmit = true;
  1312. }
  1313. else
  1314. {
  1315. /* Slave receive, master writing to slave. */
  1316. base->C1 &= ~(I2C_C1_TX_MASK | I2C_C1_TXAK_MASK);
  1317. /* Read dummy to release the bus. */
  1318. dummy = base->D;
  1319. if (dummy == 0)
  1320. {
  1321. xfer->event = kI2C_SlaveGenaralcallEvent;
  1322. }
  1323. }
  1324. if ((handle->eventMask & xfer->event) && (handle->callback))
  1325. {
  1326. handle->callback(base, xfer, handle->userData);
  1327. }
  1328. }
  1329. /* Check transfer complete flag. */
  1330. else if (status & kI2C_TransferCompleteFlag)
  1331. {
  1332. /* Slave transmit, master reading from slave. */
  1333. if (status & kI2C_TransferDirectionFlag)
  1334. {
  1335. doTransmit = true;
  1336. }
  1337. else
  1338. {
  1339. /* If we're out of data, invoke callback to get more. */
  1340. if ((!xfer->data) || (!xfer->dataSize))
  1341. {
  1342. xfer->event = kI2C_SlaveReceiveEvent;
  1343. if (handle->callback)
  1344. {
  1345. handle->callback(base, xfer, handle->userData);
  1346. }
  1347. /* Clear the transferred count now that we have a new buffer. */
  1348. xfer->transferredCount = 0;
  1349. }
  1350. /* Slave receive, master writing to slave. */
  1351. uint8_t data = base->D;
  1352. if (handle->transfer.dataSize)
  1353. {
  1354. /* Receive data. */
  1355. *handle->transfer.data++ = data;
  1356. handle->transfer.dataSize--;
  1357. xfer->transferredCount++;
  1358. if (!handle->transfer.dataSize)
  1359. {
  1360. #ifndef I2C_HAS_STOP_DETECT
  1361. xfer->event = kI2C_SlaveCompletionEvent;
  1362. xfer->completionStatus = kStatus_Success;
  1363. handle->isBusy = false;
  1364. /* Proceed receive complete event. */
  1365. if ((handle->eventMask & xfer->event) && (handle->callback))
  1366. {
  1367. handle->callback(base, xfer, handle->userData);
  1368. }
  1369. #endif /* !FSL_FEATURE_I2C_HAS_START_STOP_DETECT or !FSL_FEATURE_I2C_HAS_STOP_DETECT */
  1370. }
  1371. }
  1372. }
  1373. }
  1374. else
  1375. {
  1376. /* Read dummy to release bus. */
  1377. dummy = base->D;
  1378. }
  1379. /* Send data if there is the need. */
  1380. if (doTransmit)
  1381. {
  1382. /* If we're out of data, invoke callback to get more. */
  1383. if ((!xfer->data) || (!xfer->dataSize))
  1384. {
  1385. xfer->event = kI2C_SlaveTransmitEvent;
  1386. if (handle->callback)
  1387. {
  1388. handle->callback(base, xfer, handle->userData);
  1389. }
  1390. /* Clear the transferred count now that we have a new buffer. */
  1391. xfer->transferredCount = 0;
  1392. }
  1393. if (handle->transfer.dataSize)
  1394. {
  1395. /* Send data. */
  1396. base->D = *handle->transfer.data++;
  1397. handle->transfer.dataSize--;
  1398. xfer->transferredCount++;
  1399. }
  1400. else
  1401. {
  1402. /* Switch to receive mode. */
  1403. base->C1 &= ~(I2C_C1_TX_MASK | I2C_C1_TXAK_MASK);
  1404. /* Read dummy to release bus. */
  1405. dummy = base->D;
  1406. #ifndef I2C_HAS_STOP_DETECT
  1407. xfer->event = kI2C_SlaveCompletionEvent;
  1408. xfer->completionStatus = kStatus_Success;
  1409. handle->isBusy = false;
  1410. /* Proceed txdone event. */
  1411. if ((handle->eventMask & xfer->event) && (handle->callback))
  1412. {
  1413. handle->callback(base, xfer, handle->userData);
  1414. }
  1415. #endif /* !FSL_FEATURE_I2C_HAS_START_STOP_DETECT or !FSL_FEATURE_I2C_HAS_STOP_DETECT */
  1416. }
  1417. }
  1418. }
  1419. #if defined(I2C0)
  1420. void I2C0_DriverIRQHandler(void)
  1421. {
  1422. I2C_TransferCommonIRQHandler(I2C0, s_i2cHandle[0]);
  1423. }
  1424. #endif
  1425. #if defined(I2C1)
  1426. void I2C1_DriverIRQHandler(void)
  1427. {
  1428. I2C_TransferCommonIRQHandler(I2C1, s_i2cHandle[1]);
  1429. }
  1430. #endif
  1431. #if defined(I2C2)
  1432. void I2C2_DriverIRQHandler(void)
  1433. {
  1434. I2C_TransferCommonIRQHandler(I2C2, s_i2cHandle[2]);
  1435. }
  1436. #endif
  1437. #if defined(I2C3)
  1438. void I2C3_DriverIRQHandler(void)
  1439. {
  1440. I2C_TransferCommonIRQHandler(I2C3, s_i2cHandle[3]);
  1441. }
  1442. #endif