⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 arm(str710)usb功能的实现
💻 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 + -