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

📄 i2c.c

📁 周立功 《μCOS-II微小内核分析与程序设计-基于LPC2300》配套例程源码
💻 C
📖 第 1 页 / 共 3 页
字号:
}

/*********************************************************************************************************
** Function name:           i2cSetMode
** Descriptions:            设置I2C速度,主要用在初始化后用户想改变I2C参数,暂时该函数只开放设置速度。
**                          如果写入速度大于400K,则设置成系统默认的100K
** Input parameters:        ID   器件子设备号,例如ID=0,表示操作的设备是I2C0
**				            arg	 设置参数的字符串,该函数暂时只设置I2C速度
**				 	             例如要设置的速度为200K,则字符串为"Speed=200000"
**				            Rsv	 保留参数
** Output parameters:       NONE
** Returned value:          OPERATE_FAIL    设置失败
**                          OPERATE_SUCCESS 设置成功
*********************************************************************************************************/
int32 i2cSetMode (uint32   ID, 
                   char   *arg, 
                   void   *Rsv)
{
	volatile uint8     *pucAddrBase;
	volatile uint32     uiOffBase;
	         uint32     uiParm[1]={-1};

	Rsv         = Rsv;
	pucAddrBase = __GpiinfoDateTab[ID]->pucAddrBase;
	uiOffBase   = __GpiinfoDateTab[ID]->uiOffBase;

	if (ID < __IIC_MAX_NUM) {
		ImpCmd(Tab_I2C, arg, uiParm);                                   /*  提取字符串参数              */
		
		/*
		 *  参数过滤 
		 */
		if (uiParm[0] > 400000) {
		    uiParm[0] = 100000;
		}
		
    	__I2C_LOCK(*GpposeI2cTable[ID]);                                /*  申请I2C资源                 */
    	
		                                                                /*  设置速度                    */
		*(uint16*)(pucAddrBase + (__B_IIC_SCLH << uiOffBase)) = (uint16)((Fpclk / uiParm[0] + 1) / 2);		
		*(uint16*)(pucAddrBase + (__B_IIC_SCLL << uiOffBase)) = (uint16)((Fpclk / uiParm[0]) / 2);
				
        __I2C_UNLOCK(*GpposeI2cTable[ID]);                              /*  释放I2C资源                 */  
            	
		return OPERATE_SUCCESS;
	}
	return OPERATE_FAIL;
}

/*********************************************************************************************************
** Function name:           __i2cStart
** Descriptions:            启动I2C总线
** Input parameters:        ID   器件子设备号,例如ID=0,表示操作的设备是I2C0
** Output parameters:       NONE
** Returned value:          NONE
*********************************************************************************************************/
static void __i2cStart (uint32 ID)
{
	volatile uint8     *pucAddrBase;
	volatile uint32     uiOffBase;
	
	if (__GpiinfoDateTab[ID]->ucSlave == __IIC_SLAVER) {
	
        __I2C_UNLOCK(*GpposeI2cTable[ID]);                              /*  释放I2C资源                 */    	
	    return;                                                         /*  如果是从机就不启动总线      */
	 }
	 
	pucAddrBase = __GpiinfoDateTab[ID]->pucAddrBase;
	uiOffBase   = __GpiinfoDateTab[ID]->uiOffBase;
	
	__GpiinfoDateTab[ID]->ucIICflag = I2C_BUSY;
	pucAddrBase[__B_IIC_CLR << uiOffBase] = 0x2C;                       /*  启动总线,设置为主机         */
	pucAddrBase[__B_IIC_SET << uiOffBase] = 0x60;
}

/*********************************************************************************************************
** Function name:           i2cRead
** Descriptions:            I2c读数据函数
** Input parameters:        ID			   : I2C设备标识
**                          Addr		   : 从机地址
**                          Ret 		   : 指向返回数据存储位置的指针	
**                          Sub_Addr	   : 从机内部子地址
**                          Sub_Addr_NByte : 从机内部子地址类型 ---- 1: 单字节地址; 2: 双字节地址; 
**                          ReadNbyte      : 需要读数据个数
** Output parameters:       NONE
** Returned value:          操作成功       : OPERATE_SUCCESS
**                          操作失败       : OPERATE_FAIL
*********************************************************************************************************/
int32 i2cRead (uint32 ID,
               uint8  Addr, 
               uint8 *Ret, 
               uint16 Sub_Addr, 
               uint8  Sub_Addr_NByte, 
               uint16 ReadNbyte)
{
	if (ReadNbyte == 0) {
	    return OPERATE_FAIL;					                        /*  不允许读取0个字节           */
	}
	

	
	if (ID < __IIC_MAX_NUM) {
         __I2C_LOCK(*GpposeI2cTable[ID]);                               /*  申请信号量                  */	
		if (__GpiinfoDateTab[ID]->ucIICflag == I2C_BUSY) {
		
		    __I2C_UNLOCK(*GpposeI2cTable[ID]);                          /*  释放I2C资源                 */
		    return OPERATE_FAIL;                                        /*  忙,就返回错误              */
		}
		__GpiinfoDateTab[ID]->ucSLAddr          = (uint8)(Addr | 0x01); /*  从机地址                    */
		__GpiinfoDateTab[ID]->usSubAddr         = Sub_Addr;             /*  从机地址子地址              */
		__GpiinfoDateTab[ID]->ucSubAddrNum      = Sub_Addr_NByte;       /*  从机子地址数量              */
		__GpiinfoDateTab[ID]->ucI2CSubAddrCtl   = __IIC_SUB_R;          /*  设置为读操作                */
		__GpiinfoDateTab[ID]->pucDataBuf        = Ret;                  /*  保存数据的缓冲区            */
		__GpiinfoDateTab[ID]->usDataNum         = ReadNbyte;            /*  要读取的数据个数            */
		__i2cStart(ID);
		return OPERATE_SUCCESS;
	}
	return OPERATE_FAIL;
}

/*********************************************************************************************************
** Function name:           i2cWrite
** Descriptions:            I2c写数据函数
** Input parameters:        ID			   : I2C设备标识
**                          Addr		   : 从机地址
**                          Buf 		   : 指向写入数据存储位置的指针	
**                          Sub_Addr	   : 从机内部子地址
**                          Sub_Addr_NByte : 从机内部子地址类型 
**                                              0: 无内部子地址;
**                                              1: 单字节地址; 
**                                              2: 双字节地址; 
**                          Nbyte          : 写入数据长度
** Output parameters:       NONE
** Returned value:          操作成功       : OPERATE_SUCCESS
**                          操作失败       : OPERATE_FAIL
*********************************************************************************************************/
int32 i2cWrite (uint32  ID,
                uint8   Addr, 
                uint8  *Buf, 
                uint16  Sub_Addr, 
                uint8   Sub_Addr_NByte, 
                uint16  Nbyte)
{
	if (Nbyte == 0) {
	    return OPERATE_FAIL;					                        /*  不允许写入0个字节           */
	}
     	
	if (ID < __IIC_MAX_NUM) {
         __I2C_LOCK(*GpposeI2cTable[ID]);                               /*  申请信号量                  */
		if (__GpiinfoDateTab[ID]->ucIICflag == I2C_BUSY) {
		
		     __I2C_UNLOCK(*GpposeI2cTable[ID]);                         /*  释放I2C资源                 */
		    return OPERATE_FAIL;
		}
    	
		__GpiinfoDateTab[ID]->ucSLAddr        = (uint8)(Addr & 0xfe);   /*  从机地址                    */
		__GpiinfoDateTab[ID]->usSubAddr       = Sub_Addr;               /*  从机地址子地址              */
		__GpiinfoDateTab[ID]->ucSubAddrNum    = Sub_Addr_NByte;         /*  从机子地址数量              */
		__GpiinfoDateTab[ID]->ucI2CSubAddrCtl = __IIC_SUB_W;            /*  设置为写操作                */
		__GpiinfoDateTab[ID]->pucDataBuf      = Buf;					/*  保存数据的缓冲区            */
		__GpiinfoDateTab[ID]->usDataNum       = Nbyte;                  /*  要写入的数据个数            */
		__i2cStart(ID);
		return OPERATE_SUCCESS;
	}
	return OPERATE_FAIL;
}

/*********************************************************************************************************
** Function name:           i2cGetFlag
** Descriptions:            返回I2C器件当前状态如果通信失败,则表示上次总线操作失败,
**                          但是现在总线仍然是空闲的,空闲表示上次通信成功或没有进行过通信
**                          现在总线是空闲的,可以启动总线通信
** Input parameters:        ID             : I2C设备标识
** Output parameters:       NONE
** Returned value:          操作成功       : 返回当前I2C总线状态
**                                           I2C_IDLE: 表示总线空闲
**                                           I2C_WRITE_END:表示写操作成功
**                                           I2C_READ_END:表示读操作成功
**                                           I2C_ERR:表示总线操作失败
**                                           I2C_BUSY:表示总线正在工作中
**                          操作失败       : OPERATE_FAIL
*********************************************************************************************************/
int32 i2cGetFlag (uint8 ID)
{
    
	if (ID < __IIC_MAX_NUM) {
	    
	    __I2C_LOCK(*GpposeI2cTable[ID]);                                /*  先申请资源看总线操作是否结束*/ 
        __I2C_UNLOCK(*GpposeI2cTable[ID]);                              /*  释放I2C资源                 */    	
	    
		return __GpiinfoDateTab[ID]->ucIICflag;
	}
	return OPERATE_FAIL;
}

/*********************************************************************************************************
** Function name:           i2cGetRemainBytes
** Descriptions:            返回I2C器件还有多少字节数据没有发送完毕
** Input parameters:        ID             : I2C设备标识
** Output parameters:       NONE
** Returned value:          操作成功       : 返回当前还剩没有发送的字节数
**                          操作失败       : OPERATE_FAIL
*********************************************************************************************************/
uint32 i2cGetRemainBytes(uint8 ID)
{
	if (ID < __IIC_MAX_NUM) {
		return __GpiinfoDateTab[ID]->usDataNum;
	}
	return OPERATE_FAIL;
}

/*********************************************************************************************************
   END FILE
*********************************************************************************************************/




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -