/**
|
******************************************************************************
|
* @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****/
|