📄 i2cdev.c
字号:
OSSemPost(pi2cbusChannel->peventLock); /* 释放设备使用权 */
return (0); /* 总线错误 */
}
for (i = 0; i < uiMaxBytes - 1; i++) { /* 连续接收数据 */
__i2cRecvByte(pi2cdevDevice, (unsigned char *)&pcBuffer[i]);
}
iIsOk = __i2cRecvByteLast(pi2cdevDevice,
(unsigned char *)&pcBuffer[i]); /* 接收最后一个字节 */
if (iIsOk) {
OSSemPost(pi2cbusChannel->peventLock); /* 释放设备使用权 */
return (0); /* 总线错误 */
}
__i2cStopBus(pi2cdevDevice, __I2C_READ); /* 结束总线 */
OSSemPost(pi2cbusChannel->peventLock); /* 释放设备使用权 */
return (uiMaxBytes);
}
/*********************************************************************************************************
** Function name: i2cDevWrite
** Descriptions: 以主方式向 I2C 接口写入数据
** input parameters: pi2cdevDevice 设备控制块
** pcBuffer 缓冲区
** iNBytes 字节数
** output parameters: NONE
** Returned value: -1 表示错误 0 表示正确
** Created by: Hanhui
** Created Date: 2007/12/05
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int i2cDevWrite (PI2C_DEV pi2cdevDevice,
char *pcBuffer,
int iNBytes)
{
PI2C_BUS pi2cbusChannel = pi2cdevDevice->pi2cbusChannel;
INT8U ucError;
int iIsOk;
int i;
OSSemPend(pi2cbusChannel->peventLock, 0, &ucError); /* 等待总线使用权 */
iIsOk = __i2cStartBus(pi2cdevDevice, __I2C_WRITE); /* 以主写模式启动总线 */
if (iIsOk) {
OSSemPost(pi2cbusChannel->peventLock); /* 释放总线使用权 */
return (0); /* 总线错误 */
}
for (i = 0; i < pi2cdevDevice->ucSubAddrNum; i++) { /* 连续发送子地址 */
iIsOk = __i2cSendByte(pi2cdevDevice,
pi2cdevDevice->ucSubAddrArry[i]); /* 连续发送子地址 */
if (iIsOk) {
OSSemPost(pi2cbusChannel->peventLock); /* 释放总线使用权 */
return (0); /* 总线错误 */
}
}
for (i = 0; i < iNBytes; i++) { /* 连续发送数据 */
iIsOk = __i2cSendByte(pi2cdevDevice,
(unsigned char)pcBuffer[i]);
if (iIsOk) {
OSSemPost(pi2cbusChannel->peventLock); /* 释放总线使用权 */
return (0); /* 总线错误 */
}
}
__i2cStopBus(pi2cdevDevice, __I2C_WRITE); /* 结束总线 */
if (pi2cdevDevice->usWaitTime) {
OSTimeDly(pi2cdevDevice->usWaitTime); /* 写后等待 */
}
OSSemPost(pi2cbusChannel->peventLock); /* 释放设备使用权 */
return (iNBytes);
}
/*********************************************************************************************************
** Function name: i2cDevIoctl
** Descriptions: 以主方式向 I2C 接口写入数据
** input parameters: pi2cdevDevice 设备控制块
** pcBuffer 缓冲区
** iNBytes 字节数
** output parameters: NONE
** Returned value: -1 表示错误 0 表示正确
** Created by: Hanhui
** Created Date: 2007/12/05
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int i2cDevIoctl (PI2C_DEV pi2cdevDevice,
int iCommand,
int iArg)
{
I2C_SUB_ADDR *pi2csubaddrInfo = (I2C_SUB_ADDR *)iArg;
switch (iCommand) {
case I2C_SET_ADDR:
pi2cdevDevice->ucDevAddr = (unsigned char)iArg;
break;
case I2C_SET_BPS:
pi2cdevDevice->iBps = iArg;
pi2cdevDevice->iBpsParam = ((PCLK / 512) / iArg) & 0xF; /* 频率系数 */
break;
case I2C_SET_WAIT_TICKS:
pi2cdevDevice->usWaitTime = (unsigned short)iArg;
break;
case I2C_SET_SUB_ADDR:
if (!pi2csubaddrInfo) {
return (-1);
}
if (pi2csubaddrInfo->ucSubAddrNum >= I2C_MAX_SUBADDRS) {
return (-1);
}
memcpy(pi2cdevDevice->ucSubAddrArry,
pi2csubaddrInfo->ucSubAddrArry,
pi2csubaddrInfo->ucSubAddrNum);
pi2cdevDevice->ucSubAddrNum = pi2csubaddrInfo->ucSubAddrNum;
break;
case I2C_GET_ADDR: /* 获得子地址 */
if (!iArg) {
return (-1);
}
(*(unsigned short *)iArg) = pi2cdevDevice->ucDevAddr;
break;
case I2C_GET_BPS:
if (!iArg) {
return (-1);
}
*(unsigned int *)iArg = pi2cdevDevice->iBps;
break;
case I2C_GET_WAIT_TICKS:
if (!iArg) {
return (-1);
}
(*(unsigned short *)iArg) = pi2cdevDevice->usWaitTime;
break;
case I2C_GET_SUB_ADDR: /* 获取当前子地址 */
if (!pi2csubaddrInfo) {
return (-1);
}
memcpy(pi2csubaddrInfo->ucSubAddrArry,
pi2cdevDevice->ucSubAddrArry,
pi2cdevDevice->ucSubAddrNum);
pi2csubaddrInfo->ucSubAddrNum = pi2cdevDevice->ucSubAddrNum;
break;
}
return (0);
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -