/** ****************************************************************************** * @file fm33a0xxev_i2c.c * @author FM33A0XXEV Application Team * @version V1.0.0 * @date 16-April-2020 * @brief This file provides firmware functions to manage the following * functionalities of....: * */ /* Includes ------------------------------------------------------------------*/ #include "fm33a0xxev_i2c.h" #include "fm33a0xxev_rmu.h" /** @addtogroup fm33a0xxev_StdPeriph_Driver * @{ */ /** @defgroup I2C * @brief I2C driver modules * @{ */ /* Ö÷»úDMA×Ô¶¯ÖÕÖ¹ (Automatic Ending) 1£ºDMAÖ¸¶¨³¤¶È´«ÊäÍê³Éºó£¬×Ô¶¯·¢ËÍSTOPʱÐò 0£ºDMAÖ¸¶¨³¤¶È´«ÊäÍê³Éºó£¬µÈ´ýÈí¼þ½Ó¹Ü Ïà¹Øº¯Êý */ void I2Cx_CFGR_AUTOEND_Set(I2C_Type* I2Cx, uint32_t SetValue) { uint32_t tmpreg; tmpreg = I2Cx->CFGR ; tmpreg &= ~(I2Cx_CFGR_AUTOEND_Msk); tmpreg |= (SetValue & I2Cx_CFGR_AUTOEND_Msk); I2Cx->CFGR = tmpreg; } uint32_t I2Cx_CFGR_AUTOEND_Get(I2C_Type* I2Cx) { return (I2Cx->CFGR & I2Cx_CFGR_AUTOEND_Msk); } /* Ö÷»úDMAʹÄÜ (Master DMA Enable) 0£º¹Ø±ÕDMA¹¦ÄÜ 1£ºÊ¹ÄÜDMA¹¦ÄÜ Ïà¹Øº¯Êý */ void I2Cx_CFGR_MSP_DMAEN_Setable(I2C_Type* I2Cx, FunState NewState) { if (NewState == ENABLE) { I2Cx->CFGR |= (I2Cx_CFGR_MSP_DMAEN_Msk); } else { I2Cx->CFGR &= ~(I2Cx_CFGR_MSP_DMAEN_Msk); } } FunState I2Cx_CFGR_MSP_DMAEN_Getable(I2C_Type* I2Cx) { if (I2Cx->CFGR & (I2Cx_CFGR_MSP_DMAEN_Msk)) { return ENABLE; } else { return DISABLE; } } /* SCLÀ­µÍ³¬Ê±Ê¹ÄÜ£¨TimeOut£© 1£ºÊ¹Äܳ¬Ê±¹¦ÄÜ£¬³¬Ê±ÖÜÆÚÓÉMSPTO¼Ä´æÆ÷¶¨Òå 0£º¹Ø±Õ³¬Ê±¹¦ÄÜ Ïà¹Øº¯Êý */ void I2Cx_CFGR_TOEN_Setable(I2C_Type* I2Cx, FunState NewState) { if (NewState == ENABLE) { I2Cx->CFGR |= (I2Cx_CFGR_TOEN_Msk); } else { I2Cx->CFGR &= ~(I2Cx_CFGR_TOEN_Msk); } } FunState I2Cx_CFGR_TOEN_Getable(I2C_Type* I2Cx) { if (I2Cx->CFGR & (I2Cx_CFGR_TOEN_Msk)) { return ENABLE; } else { return DISABLE; } } /* I2CÖ÷»úÄ£¿éʹÄÜ¿ØÖÆÎ» (Master Enable) 1 = I2CÖ÷»úʹÄÜ 0 = I2CÖ÷»ú½ûÖ¹ Ïà¹Øº¯Êý */ void I2Cx_CFGR_MSPEN_Setable(I2C_Type* I2Cx, FunState NewState) { if (NewState == ENABLE) { I2Cx->CFGR |= (I2Cx_CFGR_MSPEN_Msk); } else { I2Cx->CFGR &= ~(I2Cx_CFGR_MSPEN_Msk); } } FunState I2Cx_CFGR_MSPEN_Getable(I2C_Type* I2Cx) { if (I2Cx->CFGR & (I2Cx_CFGR_MSPEN_Msk)) { return ENABLE; } else { return DISABLE; } } /* Ö÷¿Ø½ÓÊÕģʽÏ£¬½ÓÊÕʹÄÜλ (Receive Enable) 1 = Ö÷»ú½ÓÊÕʹÄÜ 0 = ½ÓÊÕ½ûÖ¹ Ïà¹Øº¯Êý */ void I2Cx_CR_RCEN_Setable(I2C_Type* I2Cx, FunState NewState) { if (NewState == ENABLE) { I2Cx->CR |= (I2Cx_CR_RCEN_Msk); } else { I2Cx->CR &= ~(I2Cx_CR_RCEN_Msk); } } FunState I2Cx_CR_RCEN_Getable(I2C_Type* I2Cx) { if (I2Cx->CR & (I2Cx_CR_RCEN_Msk)) { return ENABLE; } else { return DISABLE; } } /* STOPʱÐò²úÉúʹÄÜ¿ØÖÆÎ»£¬Èí¼þд1·¢ËÍSTOPʱÐò£¬·¢ËÍÍê³ÉºóÓ²¼þ×Ô¶¯ÇåÁã (Stop Enable) Ïà¹Øº¯Êý */ void I2Cx_CR_PEN_Setable(I2C_Type* I2Cx, FunState NewState) { if (NewState == ENABLE) { I2Cx->CR |= (I2Cx_CR_PEN_Msk); } else { I2Cx->CR &= ~(I2Cx_CR_PEN_Msk); } } FunState I2Cx_CR_PEN_Getable(I2C_Type* I2Cx) { if (I2Cx->CR & (I2Cx_CR_PEN_Msk)) { return ENABLE; } else { return DISABLE; } } /* Repeated STARTʱÐò²úÉúʹÄÜ¿ØÖÆÎ»£¬Èí¼þд1·¢ËÍSTOPʱÐò£¬·¢ËÍÍê³ÉºóÓ²¼þ×Ô¶¯ÇåÁã (ReStart Enable) Ïà¹Øº¯Êý */ void I2Cx_CR_RSEN_Setable(I2C_Type* I2Cx, FunState NewState) { if (NewState == ENABLE) { I2Cx->CR |= (I2Cx_CR_RSEN_Msk); } else { I2Cx->CR &= ~(I2Cx_CR_RSEN_Msk); } } FunState I2Cx_CR_RSEN_Getable(I2C_Type* I2Cx) { if (I2Cx->CR & (I2Cx_CR_RSEN_Msk)) { return ENABLE; } else { return DISABLE; } } /* STARTʱÐò²úÉúʹÄÜ¿ØÖÆÎ»£¬Èí¼þд1·¢ËÍSTOPʱÐò£¬·¢ËÍÍê³ÉºóÓ²¼þ×Ô¶¯ÇåÁã (Start Enable) Ïà¹Øº¯Êý */ void I2Cx_CR_SEN_Setable(I2C_Type* I2Cx, FunState NewState) { if (NewState == ENABLE) { I2Cx->CR |= (I2Cx_CR_SEN_Msk); } else { I2Cx->CR &= ~(I2Cx_CR_SEN_Msk); } } FunState I2Cx_CR_SEN_Getable(I2C_Type* I2Cx) { if (I2Cx->CR & (I2Cx_CR_SEN_Msk)) { return ENABLE; } else { return DISABLE; } } /* WCOLÖжÏʹÄܼĴæÆ÷ (Write Collide Enable) 1£ºÔÊÐíд³åÍ»ÖÐ¶Ï 0£º½ûֹд³åÍ»ÖÐ¶Ï Ïà¹Øº¯Êý */ void I2Cx_IER_WCOLE_Setable(I2C_Type* I2Cx, FunState NewState) { if (NewState == ENABLE) { I2Cx->IER |= (I2Cx_IER_WCOLE_Msk); } else { I2Cx->IER &= ~(I2Cx_IER_WCOLE_Msk); } } FunState I2Cx_IER_WCOLE_Getable(I2C_Type* I2Cx) { if (I2Cx->IER & (I2Cx_IER_WCOLE_Msk)) { return ENABLE; } else { return DISABLE; } } /* SCL³¬Ê±ÖжÏʹÄܼĴæÆ÷ (Time-Out Enable) 1£ºÔÊÐí³¬Ê±ÖÐ¶Ï 0£º½ûÖ¹³¬Ê±ÖÐ¶Ï Ïà¹Øº¯Êý */ void I2Cx_IER_TOE_Setable(I2C_Type* I2Cx, FunState NewState) { if (NewState == ENABLE) { I2Cx->IER |= (I2Cx_IER_TOE_Msk); } else { I2Cx->IER &= ~(I2Cx_IER_TOE_Msk); } } FunState I2Cx_IER_TOE_Getable(I2C_Type* I2Cx) { if (I2Cx->IER & (I2Cx_IER_TOE_Msk)) { return ENABLE; } else { return DISABLE; } } /* STARTʱÐòÖжÏʹÄܼĴæÆ÷ (START interrupt Enable) 1£ºÔÊÐíSTARTʱÐòÖÐ¶Ï 0£º½ûÖ¹STARTʱÐòÖÐ¶Ï Ïà¹Øº¯Êý */ void I2Cx_IER_SE_Setable(I2C_Type* I2Cx, FunState NewState) { if (NewState == ENABLE) { I2Cx->IER |= (I2Cx_IER_SE_Msk); } else { I2Cx->IER &= ~(I2Cx_IER_SE_Msk); } } FunState I2Cx_IER_SE_Getable(I2C_Type* I2Cx) { if (I2Cx->IER & (I2Cx_IER_SE_Msk)) { return ENABLE; } else { return DISABLE; } } /* STOPʱÐòÖжÏʹÄܼĴæÆ÷ (STOP interrupt Enable) 1£ºÔÊÐíSTOPʱÐòÖÐ¶Ï 0£º½ûÖ¹STOPʱÐòÖÐ¶Ï Ïà¹Øº¯Êý */ void I2Cx_IER_PE_Setable(I2C_Type* I2Cx, FunState NewState) { if (NewState == ENABLE) { I2Cx->IER |= (I2Cx_IER_PE_Msk); } else { I2Cx->IER &= ~(I2Cx_IER_PE_Msk); } } FunState I2Cx_IER_PE_Getable(I2C_Type* I2Cx) { if (I2Cx->IER & (I2Cx_IER_PE_Msk)) { return ENABLE; } else { return DISABLE; } } /* Ö÷»ú·¢ËÍģʽÏÂNACKÖжÏʹÄܼĴæÆ÷ (Non-ACK interrupt Enable) 1£ºÔÊÐíÊÕµ½NACK²úÉúÖÐ¶Ï 0£º½ûÖ¹²úÉúNACKÖÐ¶Ï Ïà¹Øº¯Êý */ void I2Cx_IER_NACKE_Setable(I2C_Type* I2Cx, FunState NewState) { if (NewState == ENABLE) { I2Cx->IER |= (I2Cx_IER_NACKE_Msk); } else { I2Cx->IER &= ~(I2Cx_IER_NACKE_Msk); } } FunState I2Cx_IER_NACKE_Getable(I2C_Type* I2Cx) { if (I2Cx->IER & (I2Cx_IER_NACKE_Msk)) { return ENABLE; } else { return DISABLE; } } /* I2CÖ÷»ú·¢ËÍÍê³ÉÖжÏʹÄÜ (Transmit done interrupt enable) 1£ºÔÊÐí·¢ËÍÍê³ÉÖÐ¶Ï 0£º½ûÖ¹·¢ËÍÍê³ÉÖÐ¶Ï Ïà¹Øº¯Êý */ void I2Cx_IER_TXIE_Setable(I2C_Type* I2Cx, FunState NewState) { if (NewState == ENABLE) { I2Cx->IER |= (I2Cx_IER_TXIE_Msk); } else { I2Cx->IER &= ~(I2Cx_IER_TXIE_Msk); } } FunState I2Cx_IER_TXIE_Getable(I2C_Type* I2Cx) { if (I2Cx->IER & (I2Cx_IER_TXIE_Msk)) { return ENABLE; } else { return DISABLE; } } /* I2CÖ÷»ú½ÓÊÕÍê³ÉÖжÏʹÄÜ (Receive done interrupt enable) 1£ºÔÊÐí½ÓÊÕÍê³ÉÖÐ¶Ï 0£º½ûÖ¹½ÓÊÕÍê³ÉÖÐ¶Ï Ïà¹Øº¯Êý */ void I2Cx_IER_RXIE_Setable(I2C_Type* I2Cx, FunState NewState) { if (NewState == ENABLE) { I2Cx->IER |= (I2Cx_IER_RXIE_Msk); } else { I2Cx->IER &= ~(I2Cx_IER_RXIE_Msk); } } FunState I2Cx_IER_RXIE_Getable(I2C_Type* I2Cx) { if (I2Cx->IER & (I2Cx_IER_RXIE_Msk)) { return ENABLE; } else { return DISABLE; } } /* д³åÍ»¼ì²â룬MCUÖ»ÄÜÔÚÍê³ÉSTARTʱÐò»ò·¢ËÍÍê³ÉÒ»Ö¡¶Áд֮ºó²ÅÄÜдSSPBUF£¬·ñÔò·¢Éúд³åÍ»£»Ó²¼þÖÃ룬Èí¼þд1ÇåÁã (Write Collide) 1 = ·¢ËÍд³åÍ» 0 = δ·¢Éú³åÍ» Ïà¹Øº¯Êý */ void I2Cx_ISR_WCOL_Clr(I2C_Type* I2Cx) { I2Cx->ISR = I2Cx_ISR_WCOL_Msk; } FlagStatus I2Cx_ISR_WCOL_Chk(I2C_Type* I2Cx) { if (I2Cx->ISR & I2Cx_ISR_WCOL_Msk) { return SET; } else { return RESET; } } /* SCL³¬Ê±ÖжϱêÖ¾ Ïà¹Øº¯Êý */ void I2Cx_ISR_OVT_Clr(I2C_Type* I2Cx) { I2Cx->ISR = I2Cx_ISR_TO_Msk; } FlagStatus I2Cx_ISR_OVT_Chk(I2C_Type* I2Cx) { if (I2Cx->ISR & I2Cx_ISR_TO_Msk) { return SET; } else { return RESET; } } /* STARTʱÐò·¢ËÍÍê³ÉÖжϱêÖ¾£¬Ó²¼þÖÃ룬Èí¼þ¶ÁÈ¡ºóÇåÁã (START done) Ïà¹Øº¯Êý */ FlagStatus I2Cx_ISR_S_Chk(I2C_Type* I2Cx) { if (I2Cx->ISR & I2Cx_ISR_S_Msk) { return SET; } else { return RESET; } } /* STOPʱÐò·¢ËÍÍê³ÉÖжϱêÖ¾£¬Ó²¼þÖÃ룬Èí¼þ¶ÁÈ¡ºóÇåÁã (STOP done) Ïà¹Øº¯Êý */ FlagStatus I2Cx_ISR_P_Chk(I2C_Type* I2Cx) { if (I2Cx->ISR & I2Cx_ISR_P_Msk) { return SET; } else { return RESET; } } /* Ö÷¿Ø·¢ËÍģʽÏ£¬À´×Ô´Ó»úµÄ»ØÓ¦Ðźţ»µ±Ö÷»ú·¢ËͺóÊÕµ½NACK£¬´Ë±êÖ¾¿ÉÒÔ²úÉúÖжϣ»Ó²¼þÖÃ룬Èí¼þд1ÇåÁã¡£(Acknowledge Status) 1£º´Ó»ú»ØÓ¦NACK 0£º´Ó»ú»ØÓ¦ACK Ïà¹Øº¯Êý */ void I2Cx_ISR_ACKSTA_Clr(I2C_Type* I2Cx) { I2Cx->ISR = I2Cx_ISR_ACKSTA_Msk; } FlagStatus I2Cx_ISR_ACKSTA_Chk(I2C_Type* I2Cx) { if (I2Cx->ISR & I2Cx_ISR_ACKSTA_Msk) { return SET; } else { return RESET; } } /* I2CÖ÷»ú·¢ËÍÍê³ÉÖжϱêÖ¾£¬Ó²¼þÖÃ룬Èí¼þд1ÇåÁã (Transmit done interrupt flag) Ïà¹Øº¯Êý */ void I2Cx_ISR_TXIF_Clr(I2C_Type* I2Cx) { I2Cx->ISR = I2Cx_ISR_TXIF_Msk; } FlagStatus I2Cx_ISR_TXIF_Chk(I2C_Type* I2Cx) { if (I2Cx->ISR & I2Cx_ISR_TXIF_Msk) { return SET; } else { return RESET; } } /* I2CÖ÷»ú½ÓÊÕÍê³ÉÖжϱêÖ¾£¬Ó²¼þÖÃ룬Èí¼þд1ÇåÁã (Receive done interrupt flag) Ïà¹Øº¯Êý */ void I2Cx_ISR_RXIF_Clr(I2C_Type* I2Cx) { I2Cx->ISR = I2Cx_ISR_RXIF_Msk; } FlagStatus I2Cx_ISR_RXIF_Chk(I2C_Type* I2Cx) { if (I2Cx->ISR & I2Cx_ISR_RXIF_Msk) { return SET; } else { return RESET; } } /* I2CͨÐÅ״̬λ (I2C is busy) 1£º½Ó¿Ú´¦ÓÚ¶Áд״̬£¬ÕýÔÚ½øÐÐÊý¾Ý´«Ê䣬 0£ºÒÑÍê³ÉÊý¾Ý´«Êä Ïà¹Øº¯Êý */ FlagStatus I2Cx_SR_BUSY_Chk(I2C_Type* I2Cx) { if (I2Cx->SR & I2Cx_SR_BUSY_Msk) { return SET; } else { return RESET; } } /* I2C´«Êä·½Ïò״̬λ (Read or Write Bar) 1£ºÖ÷»ú´Ó´Ó»ú¶ÁÈ¡Êý¾Ý 0£ºÖ÷»úÏò´Ó»úдÈëÊý¾Ý Ïà¹Øº¯Êý */ FlagStatus I2Cx_SR_RW_Chk(I2C_Type* I2Cx) { if (I2Cx->SR & I2Cx_SR_RW_Msk) { return SET; } else { return RESET; } } /* »º³åÆ÷Âú״̬λ (Buffer full) ½ÓÊÕ£º 1 = ½ÓÊÕÍê³É£¬SSPBUFÂú 0 = ½ÓÊÕδÍê³É£¬SSPBUF¿Õ ·¢ËÍ£º 1 = ÕýÔÚ·¢ËÍ£¬SSPBUFÂú 0 = ·¢ËÍÍê³É£¬SSPBUF¿Õ Ïà¹Øº¯Êý */ FlagStatus I2Cx_SR_BF_Chk(I2C_Type* I2Cx) { if (I2Cx->SR & I2Cx_SR_BF_Msk) { return SET; } else { return RESET; } } /* Ö÷¿Ø½ÓÊÕģʽÏ£¬Ö÷»ú»ØÓ¦ÐźŵÄ״̬ (Acknowledge mode) 1£ºÖ÷»ú»Ø·¢NACK 0£ºÖ÷»ú»Ø·¢ACK ×¢Ò⣺±ØÐëÔÚP±êÖ¾¼Ä´æÆ÷±»ÇåÁãµÄÇé¿öÏ£¬Èí¼þ²ÅÄÜÖÃλACKMO Ïà¹Øº¯Êý */ void I2Cx_SR_ACKMO_Set(I2C_Type* I2Cx,uint32_t SetValue) { uint32_t tmpreg; tmpreg = I2Cx->SR; tmpreg &= ~(I2Cx_SR_ACKMO_Msk); tmpreg |= (SetValue & I2Cx_SR_ACKMO_Msk); I2Cx->SR = tmpreg; } uint32_t I2Cx_SR_ACKMO_Get(I2C_Type* I2Cx) { return (I2Cx->SR & I2Cx_SR_ACKMO_Msk); } /* Ö÷»ú·¢Ë͵ÄSCLʱÖÓ¸ßµçÆ½¿í¶È£¬ÒÔI2C¹¤×÷ʱÖÓ¼ÆÊý Ïà¹Øº¯Êý */ void I2Cx_BRG_MSPBRGH_Set(I2C_Type* I2Cx, uint32_t SetValue) { uint32_t tmpreg; tmpreg = I2Cx->BRG; tmpreg &= ~(I2Cx_BRG_MSPBRGH_Msk); tmpreg |= (SetValue & I2Cx_BRG_MSPBRGH_Msk); I2Cx->BRG = tmpreg; } uint32_t I2Cx_BRG_MSPBRGH_Get(I2C_Type* I2Cx) { return (I2Cx->BRG & I2Cx_BRG_MSPBRGH_Msk); } /* Ö÷»ú·¢Ë͵ÄSCLʱÖÓµÍµçÆ½¿í¶È£¬ÒÔI2C¹¤×÷ʱÖÓ¼ÆÊý Ïà¹Øº¯Êý */ void I2Cx_BRG_MSPBRGL_Set(I2C_Type* I2Cx, uint32_t SetValue) { uint32_t tmpreg; tmpreg = I2Cx->BRG; tmpreg &= ~(I2Cx_BRG_MSPBRGL_Msk); tmpreg |= (SetValue & I2Cx_BRG_MSPBRGL_Msk); I2Cx->BRG = tmpreg; } uint32_t I2Cx_BRG_MSPBRGL_Get(I2C_Type* I2Cx) { return (I2Cx->BRG & I2Cx_BRG_MSPBRGL_Msk); } /* SSPBUF[7:0]£ºÊý¾ÝµÄ¶Áдͨ¹ý¶ÔSSPBUFµÄ²Ù×÷Íê³É¡£·¢ËÍʱ£¬¶ÔSSPBUFÖ´ÐÐд²Ù×÷£¬Í¬Ê±Ò²ÔØÈëÊý¾ÝÊÕ·¢ÒÆÎ»¼Ä´æÆ÷(SSPSR)£»½ÓÊÕʱ£¬SSPBUFÓëSSPSR×é³ÉË«»º³å½á¹¹£¬¶Á³öÊý¾ÝΪSSPBUFµÄÊý¾Ý¡£½ÓÊÕÍêÒ»¸ö×Ö½ÚµÄÊý¾Ý£¬SSPSR½«Êý¾ÝÔØÈëSSPBUF£¬Í¬Ê±ÖÃλI2CIF¡£SSPSR²»ÊÇÖ±½Ó¼Ä´æÆ÷£¬Ã»ÓÐÎïÀíµØÖ· Ïà¹Øº¯Êý */ void I2Cx_BUF_Write(I2C_Type* I2Cx, uint32_t SetValue) { I2Cx->BUF = (SetValue & I2Cx_BUF_WR_Msk); } uint32_t I2Cx_BUF_Read(I2C_Type* I2Cx) { return (I2Cx->BUF & I2Cx_BUF_WR_Msk); } /* ¶¨ÒåSDAÏà¶ÔÓÚSCLϽµÑصı£³Öʱ¼ä²ÎÊý£¬ÒÔI2C¹¤×÷ʱÖÓ¼ÆÊý (SDA hold time) Ïà¹Øº¯Êý */ void I2Cx_TIMING_Write(I2C_Type* I2Cx, uint32_t SetValue) { I2Cx->TIMING = (SetValue & I2Cx_TIMING_SDAHD_Msk); } uint32_t I2Cx_TIMING_Read(I2C_Type* I2Cx) { return (I2Cx->TIMING & I2Cx_TIMING_SDAHD_Msk); } /* ¶¨Òå´Ó»úSCLµÍµçƽÑÓÕ¹³¬Ê±ÖÜÆÚ£¬Èí¼þ¿ÉÒÔÔÚMSPEN=0µÄÇé¿öϸÄд TSCL_STRETCHING_TIMEOUT=TIMEOUT[11:0] * TSCL Ïà¹Øº¯Êý */ void I2Cx_TO_Write(I2C_Type* I2Cx, uint32_t SetValue) { I2Cx->TO = (SetValue & I2Cx_TO_TIMEOUT_Msk); } uint32_t I2Cx_TO_Read(I2C_Type* I2Cx) { return (I2Cx->TO & I2Cx_TO_TIMEOUT_Msk); } void I2Cx_Deinit(I2C_Type* I2Cx) { RMU_PRSTEN_Write(0x13579BDF); if(I2Cx == I2C0) { RMU_APBRST2_I2C0RST_Setable(ENABLE); RMU_APBRST2_I2C0RST_Setable(DISABLE); } if(I2Cx == I2C1) { RMU_APBRST1_I2C1RST_Setable(ENABLE); RMU_APBRST1_I2C1RST_Setable(DISABLE); } RMU_PRSTEN_Write(0x00000000); } /******************************** I2C²¨ÌØÂʼĴæÆ÷Öµ¼ÆË㺯Êý ¹¦ÄÜ£ºI2C²¨ÌØÂʼĴæÆ÷Öµ¼ÆËã ÊäÈ룺ÆÚÍû²¨ÌØÂÊ@Hz£¬ APBClk @Hz Êä³ö£ºI2CBRG¶ÔÓ¦ÆÚÍû²¨ÌØÂʵÄÅäÖÃÖµ ********************************/ uint32_t I2C_BaudREG_Calc(uint32_t I2CClk, uint32_t APBClk) { uint32_t TempREG; TempREG = APBClk/(2*I2CClk); if( TempREG >= 1 ) TempREG = TempREG - 1; return TempREG; } /******END OF FILE****/