📄 i2c.c
字号:
}
/*********************************************************************************************************
** 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 + -