You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

316 lines
7.9 KiB

/*********************************************************
*Copyright (C), 2015, Shanghai Eastsoft Microelectronics Co., Ltd.
*文件名: lib_iic.c
*作 者: AE Team
*版 本: V1.01
*日 期: 2021/06/09
*描 述: IIC模块库函数
*备 注:
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
**********************************************************/
#include "lib_iic.h"
#include "system_ES8P5066.h"
/*************************************
函数名:IIC_Init
描 述:IIC初始化
输入值:I2C0/I2C1
初始化结构体
返回值:无
**************************************/
void IIC_Init(I2C_TypeDef *IICx, IIC_InitStruType *IIC_InitStruct)
{
uint32_t tmp;
if (IIC_InitStruct->IIC_Mode == IIC_Mode_Master)
{
if (IIC_InitStruct->IIC_16XSamp != Disable)
tmp = SystemCoreClock / 24 / IIC_InitStruct->IIC_Clk - 1;
else
tmp = SystemCoreClock / 16 / IIC_InitStruct->IIC_Clk - 1;
tmp = tmp > 255 ? 255 : tmp;
IICx->CON.TJP = tmp;
IICx->CON.TJE = 0x1;
}
IICx->CON.SDASE = IIC_InitStruct->IIC_16XSamp;
IICx->CON.SCLSE = IIC_InitStruct->IIC_16XSamp;
IICx->CON.SCLOD = IIC_InitStruct->IIC_SckOd;
IICx->CON.SDAOD = IIC_InitStruct->IIC_SdaOd;
IICx->MOD.MS = IIC_InitStruct->IIC_Mode;
IICx->MOD.SPAE = IIC_InitStruct->IIC_AutoStop;
IICx->MOD.SRAE = IIC_InitStruct->IIC_AutoCall;
return;
}
/*************************************
函数名:IIC_ITConfig
描 述:中断使能
输入值:I2C0/I2C1
中断类型
使能/禁止
返回值:无
**************************************/
void IIC_ITConfig(I2C_TypeDef *IICx, IIC_TYPE_IT IIC_IT, TYPE_FUNCEN NewState)
{
if (NewState == Enable)
IICx->IE.Word |= (uint32_t)IIC_IT;
else
IICx->IE.Word &= ~((uint32_t)IIC_IT);
return;
}
/*************************************
函数名:IIC_SendAddress
描 述:发送从机地址
输入值:I2C0/I2C1
从机地址
操作模式:读/写
返回值:无
**************************************/
void IIC_SendAddress(I2C_TypeDef *IICx, uint8_t IIC_Address, IIC_TYPE_RWMODE Mode)
{
IICx->CON.SA = IIC_Address >> 1;
IICx->CON.RW = Mode;
return;
}
/*************************************
函数名:IIC_SetAddress
描 述:设置从机地址
输入值:I2C0/I2C1
从机地址
返回值:无
**************************************/
void IIC_SetAddress(I2C_TypeDef *IICx, uint8_t IIC_Address)
{
IICx->CON.SA = IIC_Address >> 1;
return;
}
/*************************************
函数名:IIC_RecModeConfig
描 述:接收模式配置
输入值:I2C0/I2C1
接收模式
返回值:无
**************************************/
void IIC_RecModeConfig(I2C_TypeDef *IICx, IIC_TYPE_RECMODE RecType)
{
IICx->MOD.RDM = RecType;
return;
}
/*************************************
函数名:IIC_TBIMConfig
描 述:发送缓冲器空中断类型
输入值:I2C0/I2C1
中断类型
返回值:无
**************************************/
void IIC_TBIMConfig(I2C_TypeDef *IICx, IIC_TYPE_TRBIM Type)
{
IICx->IE.TBIM = Type;
return;
}
/*************************************
函数名:IIC_RBIMConfig
描 述:接收缓冲器满中断类型
输入值:I2C0/I2C1
中断类型
返回值:无
**************************************/
void IIC_RBIMConfig(I2C_TypeDef *IICx, IIC_TYPE_TRBIM Type)
{
IICx->IE.RBIM = Type;
return;
}
/*************************************
函数名:IIC_AckDelay
描 述:设置延迟应答
输入值:I2C0/I2C1
延迟时间
使能/禁止
返回值:无
**************************************/
void IIC_AckDelay(I2C_TypeDef *IICx, IIC_TYPE_ADLY Type, TYPE_FUNCEN NewStatus)
{
IICx->MOD.ADLY = Type;
IICx->MOD.ADE = NewStatus;
return;
}
/*************************************
函数名:IIC_TISConfig
描 述:设置数据帧传输间隔
输入值:I2C0/I2C1
间隔时间
返回值:无
**************************************/
void IIC_TISConfig(I2C_TypeDef *IICx, IIC_TYPE_TIS Time)
{
IICx->MOD.TIS = Time;
return;
}
/*************************************
函数名:IIC_SendByte
描 述:发送一个字节
输入值:I2C0/I2C1
需要发送的数据
返回值:无
**************************************/
void IIC_SendByte(I2C_TypeDef *IICx, uint8_t Byte)
{
IICx->TBW.Byte[0] = Byte;
return;
}
/*************************************
函数名:IIC_SendHalfWord
描 述:发送半字
输入值:I2C0/I2C1
需要发送的数据
返回值:无
**************************************/
void IIC_SendHalfWord(I2C_TypeDef *IICx, uint16_t HalfWord)
{
IICx->TBW.HalfWord[0] = HalfWord;
return;
}
/*************************************
函数名:IIC_SendWord
描 述:发送半字
输入值:I2C0/I2C1
需要发送的数据
返回值:无
**************************************/
void IIC_SendWord(I2C_TypeDef *IICx, uint32_t Word)
{
IICx->TBW.Word = Word;
return;
}
/*************************************
函数名:IIC_RecByte
描 述:接收一个字节
输入值:I2C0/I2C1
返回值:接收到的数据
**************************************/
uint8_t IIC_RecByte(I2C_TypeDef *IICx)
{
return IICx->RBR.Byte[0];
}
/*************************************
函数名:IIC_RecHalfWord
描 述:接收半字
输入值:I2C0/I2C1
返回值:接收到的数据
**************************************/
uint16_t IIC_RecHalfWord(I2C_TypeDef *IICx)
{
return IICx->RBR.HalfWord[0];
}
/*************************************
函数名:IIC_RecWord
描 述:接收字
输入值:I2C0/I2C1
返回值:接收到的数据
**************************************/
uint32_t IIC_RecWord(I2C_TypeDef *IICx)
{
return IICx->RBR.Word;
}
/*************************************
函数名:IIC_GetRWMode
描 述:获取IIC读写状态
输入值:I2C0/I2C1
返回值:读写状态
**************************************/
IIC_TYPE_RWMODE IIC_GetRWMode(I2C_TypeDef *IICx)
{
IIC_TYPE_RWMODE status;
status = IICx->CON.RW == 0 ? IIC_Mode_Write : IIC_Mode_Read;
return status;
}
/*************************************
函数名:IIC_GetTBStatus
描 述:获取发送缓冲器状态,TB0-TB3全空返回SET,否则返回RESET
输入值:I2C0
返回值:SET/RESET
**************************************/
FlagStatus IIC_GetTBStatus(I2C_TypeDef *IICx)
{
FlagStatus status;
if ((IICx->STA.Word & (uint32_t)0xf00) != (uint32_t)0xf00)
status = RESET;
else
status = SET;
return status;
}
/*************************************
函数名:IIC_GetFlagStatus
描 述:获取中断标志位状态
输入值:I2C0/I2C1
中断类型
返回值:SET/RESET
**************************************/
FlagStatus IIC_GetFlagStatus(I2C_TypeDef *IICx, IIC_TYPE_IF IIC_Flag)
{
FlagStatus status;
if ((IICx->IF.Word & (uint32_t)IIC_Flag) != RESET)
status = SET;
else
status = RESET;
return status;
}
/*************************************
函数名:IIC_GetITStatus
描 述:获取中断使能状态
输入值:I2C0/I2C1
中断类型
返回值:SET/RESET
**************************************/
FlagStatus IIC_GetITStatus(I2C_TypeDef *IICx, IIC_TYPE_IT IIC_Flag)
{
FlagStatus status = RESET;
if ((IICx->IE.Word & (uint32_t)IIC_Flag) == RESET)
return status;
if ((IICx->IF.Word & (uint32_t)IIC_Flag) != RESET)
status = SET;
return status;
}
/*************************************
函数名:IIC_GetITStatus
描 述:清除中断状态
输入值:I2C0/I2C1
中断类型
返回值:无
**************************************/
void IIC_ClearITPendingBit(I2C_TypeDef *IICx, IIC_CLR_IF IIC_IT)
{
IICx->IF.Word = (uint32_t)IIC_IT;
return;
}