📄 i2c.c
字号:
/****************************************Copyright (c)**************************************************
**
** STR710 development team
**
**
**
**
**--------------文件信息--------------------------------------------------------------------------------
** 文 件 名: i2c.c
** 创 建 人: lhl
** 创建日期: 2006年5月14日
** 描 述: 该文件包含了UART的基本功能函数
**
**--------------历史版本--------------------------------------------------------------------------------
** 创 建 人: lhl
** 版 本: V1.0
** 日 期: 2006年5月14日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "i2c.h"
#include "gpio.h"
#include "config.h"
#if EN_ARM_I2C > 0 //决定是否编译该文件
/******************************************* 全局变量定义 ***********************************************/
/******************************************* 局部函数声明 ***********************************************/
/*********************************************************************************************************
;** 函数名称: I2C_Init
;** 功能描述: 初始化I2C设备
;**
;** 参 数: i2cx:I2C0 I2C1
;**
;** 返 回 值: 无
;**
;** 作 者: lhl
;** 日 期: 2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void I2C_Init(I2C_T i2cx)
{
UWORD8 i2c_temp;
if(i2cx == I2C0)
{
GPIO_ModeConfig(GPIO1, I2C0_SCLPIN, GPIO_AF_OD); /* 配置I2C管脚 */
GPIO_ModeConfig(GPIO1, I2C0_SDAPIN, GPIO_AF_OD);
I2C0_CR = 0;
I2C0_CCR = 0;
I2C0_OAR1 = 0;
I2C0_OAR2 = 0;
I2C0_ECCR = 0;
I2C0_DR = 0;
i2c_temp = I2C0_SR1;
i2c_temp = I2C0_SR2;
}
else
{
GPIO_ModeConfig(GPIO0, I2C1_SCLPIN, GPIO_AF_OD);
GPIO_ModeConfig(GPIO0, I2C1_SDAPIN, GPIO_AF_OD);
I2C1_CR = 0;
I2C1_CCR = 0;
I2C1_OAR1 = 0;
I2C1_OAR2 = 0;
I2C1_ECCR = 0;
I2C1_DR = 0;
i2c_temp = I2C1_SR1;
i2c_temp = I2C1_SR2;
}
}
/*********************************************************************************************************
;** 函数名称: I2C_Enable
;** 功能描述: I2C设备使能,开启。
;**
;** 参 数: i2cx:I2C0 I2C1
;**
;** 返 回 值: 无
;**
;** 作 者: lhl
;** 日 期: 2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void I2C_Enable(I2C_T i2cx)
{
I2C_PEBitEnable(i2cx);
I2C_PEBitEnable(i2cx);
}
/*********************************************************************************************************
;** 函数名称: I2C_Disable
;** 功能描述: I2C设备关闭。
;**
;** 参 数: i2cx:I2C0 I2C1
;**
;** 返 回 值: 无
;**
;** 作 者: lhl
;** 日 期: 2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void I2C_Disable(I2C_T i2cx)
{
I2C_PEBitDisable(i2cx);
}
/*********************************************************************************************************
;** 函数名称: I2C_Config
;** 功能描述: I2C设备设置速度。
;**
;** 参 数: i2cx:I2C0 I2C1 speed:I2C速度
;**
;** 返 回 值: 无
;**
;** 作 者: lhl
;** 日 期: 2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void I2C_Config(I2C_T i2cx,UWORD32 speed)
{
UWORD16 result;
UWORD32 fpclk;
fpclk = RCCU_AnyClockObtain(RCCU_FCLK);
if(speed <1)
return;
if (speed <=100000)
{
result = ((fpclk/speed)/2)-7;
I2C_CCRWrite(i2cx, (UWORD8)result &0x7f);
}
else if (speed <=400000)
{
result = ((fpclk/speed)/3)-9;
I2C_CCRWrite(i2cx, (UWORD8)result |0x80);
}
I2C_ECCRWrite(i2cx, result >>7);
}
/*********************************************************************************************************
;** 函数名称: I2C_MasterSendByte7Addr
;** 功能描述: I2C设备作为主设备,7位地址,向从设备发送数据。
;**
;** 参 数: i2cx:I2C0 I2C1 addr:从设备器件地址 data:发送数据的首地址 data_cnt:发送数据的个数
;**
;** 返 回 值: 无
;**
;** 作 者: lhl
;** 日 期: 2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void I2C_MasterSendByte7Addr(I2C_T i2cx,UWORD16 addr,UWORD8 *data,UWORD8 data_cnt)
{
UWORD8 i = 0;
/* 开始发送开始位,由默认的SLAVE进入MASTER状态 */
I2C_StartBit(i2cx); /* 发送开始位 */
while(!(I2C_SR1Read(i2cx)& I2C_SB)); /* 等待开始位发送成功 */
/* 开始发送地址 */
I2C_DRWrite(i2cx, (UWORD8)(addr&0xFE)); /* 发送i2c器件硬件地址和读写位 */
while(!(I2C_SR2Read(i2cx)& I2C_ENDAD)); /* 等待地址发送结束 */
I2C_PEBitEnable(i2cx); /* 清除ENDAD位 */
/*下面开始发送数据 */
while(!(I2C_SR1Read(i2cx)& I2C_BTF)); /* 等待和清除发送标志 */
while( i < data_cnt)
{
I2C_DRWrite(i2cx,data[i++]); /* 发送数据 */
while(!(I2C_SR1Read(i2cx)& I2C_BTF)); /* 等待和清除发送标志 */
}
I2C_StopBit(i2cx); /* 发送结束位 */
while(I2C_ReadStopBit(i2cx)& I2C_STOP_Mask); /* 等待结束位发送完成 */
}
/*********************************************************************************************************
;** 函数名称: I2C_MasterRecByte7Addr
;** 功能描述: I2C设备作为主设备,7位地址,从从设备读取数据
;**
;** 参 数: i2cx:I2C0 I2C1 addr:从设备器件地址 data:接收数据的首地址 data_cnt:接收数据的个数
;**
;** 返 回 值: 无
;**
;** 作 者: lhl
;** 日 期: 2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void I2C_MasterRecByte7Addr(I2C_T i2cx,UWORD16 addr,UWORD8 *data,UWORD8 data_cnt)
{
UWORD8 i = 0;
/* 开始发送开始位,由默认的SLAVE进入MASTER状态 */
I2C_StartBit(i2cx); /* 发送开始位 */
while(!(I2C_SR1Read(i2cx)& I2C_SB)); /* 等待开始位发送成功 */
/* 开始发送地址 */
I2C_DRWrite(i2cx, (UWORD8)(addr|0x01)); /* 发送器件地址和读写位 */
while(!(I2C_SR2Read(i2cx)& I2C_ENDAD)); /* 等待地址发送结束 */
I2C_PEBitEnable(i2cx); /* 清除ENDAD位 */
I2C_ACKBit(i2cx);
/* 下面开始接受数据 */
while(i<data_cnt-1)
{
while(!(I2C_SR1Read(i2cx)& I2C_BTF)); /* 等待和清除接收标志 */
data[i++] = I2C_DRRead(i2cx); /* 读取数据 */
}
(*((volatile unsigned char *)(I2C0_BASE + 0x1000 * i2cx ))) &= ~I2C_ACK_Mask;
while(!(I2C_SR1Read(i2cx)& I2C_BTF)); /* 等待和清除接收标志 */
I2C_StopBit(i2cx); /* 发送停止位 */
data[i++] = I2C_DRRead(i2cx); /* 读取数据 */
while(I2C_ReadStopBit(i2cx)& I2C_STOP_Mask); /* 等待结束位发送完成 */
}
/*********************************************************************************************************
;** 函数名称: I2C_MasterSendByte10Addr
;** 功能描述: I2C设备作为主设备,10位地址,向从设备发送数据。
;**
;** 参 数: i2cx:I2C0 I2C1 addr:从设备器件地址 data:发送数据的首地址 data_cnt:发送数据的个数
;**
;** 返 回 值: 无
;**
;** 作 者: lhl
;** 日 期: 2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void I2C_MasterSendByte10Addr(I2C_T i2cx,UWORD16 addr,UWORD8 *data,UWORD8 data_cnt)
{
UWORD8 i = 0;
/* 开始发送开始位,由默认的SLAVE进入MASTER状态 */
I2C_StartBit(i2cx); /* 发送开始位 */
while(!(I2C_SR1Read(i2cx)& I2C_SB)); /* 等待开始位发送成功 */
/* 开始发送地址 */
I2C_DRWrite(i2cx, (UWORD8)(I2C_HEAD|(addr>>7))); /* 发送头和高字节 */
while(!(I2C_SR1Read(i2cx)& I2C_ADD10)); /* 等待高字节发完(一个字节发完) */
I2C_DRWrite(i2cx, (UWORD8)(addr&0xFE)); /* 发送低字节和读写位 */
while(!(I2C_SR2Read(i2cx)& I2C_ENDAD)); /* 等待地址发送结束 */
I2C_PEBitEnable(i2cx); /* 清除ENDAD位 */
while(!(I2C_SR1Read(i2cx)& I2C_BTF)); /* 等待和清除发送标志 */
/* 下面开始发送数据 */
while( i < data_cnt)
{
I2C_DRWrite(i2cx,data[i++]); /* 发送数据 */
while(!(I2C_SR1Read(i2cx)& I2C_BTF)); /* 等待和清除发送标志 */
}
I2C_StopBit(i2cx); /* 发送停止位 */
while(I2C_ReadStopBit(i2cx)& I2C_STOP_Mask); /* 等待结束位发送完成 */
}
/*********************************************************************************************************
;** 函数名称: I2C_MasterRecByte10Addr
;** 功能描述: I2C设备作为主设备,10位地址,从从设备读取数据
;**
;** 参 数: i2cx:I2C0 I2C1 addr:从设备器件地址 data:接收数据的首地址 data_cnt:接收数据的个数
;**
;** 返 回 值: 无
;**
;** 作 者: lhl
;** 日 期: 2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void I2C_MasterRecByte10Addr(I2C_T i2cx,UWORD16 addr,UWORD8 *data,UWORD8 data_cnt)
{
UWORD8 i = 0;
/* 开始发送开始位,由默认的SLAVE进入MASTER状态 */
I2C_StartBit(i2cx);
while(!(I2C_SR1Read(i2cx)& I2C_SB)); /* 等待开始位发送成功 */
/* 开始发送地址 */
I2C_DRWrite(i2cx,(UWORD8)(I2C_HEAD|((addr>>7)&0XF6))); /* 发送头和高字节 */
while(!(I2C_SR1Read(i2cx)& I2C_ADD10)); /* 等待高字节发完(一个字节发完) */
I2C_DRWrite(i2cx, (UWORD8)(addr&0xFE)); /* 发送低字节和读写位 */
while(!(I2C_SR2Read(i2cx)& I2C_ENDAD)); /* 等待地址发送结束 */
I2C_PEBitEnable(i2cx); /* 清除ENDAD位 */
while(!(I2C_SR1Read(i2cx)& I2C_BTF)); /* 等待和清除发送标志 */
I2C_StartBit(i2cx); /* 发送开始位 */
while(!(I2C_SR1Read(i2cx)& I2C_SB)); /* 等待开始位成功 */
I2C_DRWrite(i2cx, (UWORD8)(I2C_HEAD|((addr>>7)&0XF6)) );/* 发送头字节和高位地址 */
while(!(I2C_SR2Read(i2cx)& I2C_ENDAD)); /* 等待和清除地址位发送结束 */
I2C_PEBitEnable(i2cx);
/* 下面开始接受数据 */
while(i<data_cnt-1)
{
while(!(I2C_SR1Read(i2cx)& I2C_BTF)); /* 等待和清除数据发送结束标志 */
data[i++] = I2C_DRRead(i2cx); /* 读取数据 */
}
while(!(I2C_SR1Read(i2cx)& I2C_BTF)); /* 等待和清除数据发送结束标志 */
I2C_StopBit(i2cx); /* 发送结束位 */
data[i++] = I2C_DRRead(i2cx); /* 读取数据 */
while(I2C_ReadStopBit(i2cx)& I2C_STOP_Mask); /* 等待结束位发送成功 */
}
/*********************************************************************************************************
;** 函数名称: I2C_SlaveSetAddr
;** 功能描述: I2C设备作为从设备,并设置地址
;**
;** 参 数: i2cx:I2C0 I2C1 addr:从设备器件地址 frn:fclk1的频率范围
;**
;** 返 回 值: 无
;**
;** 作 者: lhl
;** 日 期: 2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void I2C_SlaveSetAddr(I2C_T i2cx,UWORD16 addr,UWORD8 frn)
{
I2C_OAR1Write(i2cx,(UWORD8)(addr&0xFF));
I2C_OAR2Write(i2cx,(UWORD8)((addr>>8)|(frn<<5)));
}
#endif //EN_ARM_I2C > 0
/****************************************end of file*******************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -