BOOL USBTOI2C::SlaveReadS(ULONG iIndex,UCHAR SLA_addres,UCHAR Conmand_ID,UCHAR size,PUCHAR oInByte)
{
for(UCHAR i=0;i<6;i++)
{
if(I2CDelayR[i]>5000)
I2CDelayR[i] = 1000;
}
if(I2CDelayR[2]>4500)
I2CDelayR[2] = 14000;
UCHAR RSize=size;
if(!I2C_IssueStart(iIndex))
//return FALSE;
//I2C_IssueStart(iIndex);
Delayus(I2CDelayR[0]);
if(!I2C_OutByteCheckAck(iIndex,SLA_addres)) // 输出一字节数据并检查应答是否有效// 指定USB2I2C设备序号// 准备写出的数据
return FALSE;
//I2C_OutByteCheckAck(iIndex,SLA_addres);
Delayus(I2CDelayR[1]);
if(!I2C_OutByteCheckAck(iIndex,Conmand_ID)) // 输出一字节数据并检查应答是否有效// 指定USB2I2C设备序号// 准备写出的数据
{
//Delayus(14000);
if((I2CDelayR[2]%100)==99)
{
USBIO_ResetDevice(iIndex );
Delayus(1000);
}
}
Delayus(I2CDelayR[2]);
if(!I2C_IssueStart(iIndex))
return FALSE;
//I2C_IssueStart(iIndex);
Delayus(I2CDelayR[3]);
if(!I2C_OutByteCheckAck(iIndex,(SLA_addres|1))) // 输出一字节数据并检查应答是否有效// 指定USB2I2C设备序号// 准备写出的数据
return FALSE;
//I2C_OutByteCheckAck(iIndex,(SLA_addres|1));
Delayus(I2CDelayR[4]);
//I2C_InBlockByAck(iIndex,(RSize-1),oInByte);
for(UCHAR i=0;i<(RSize-1);i++)
{
if(!I2C_InBlockByAck(iIndex,1,oInByte+i)) // 输入数据块,每输入一个字节都产生有效应答// 指定USB2I2C设备序号// 准备读取的数据字节数,单次必须小于32字节// 指向一个缓冲区,返回后是读入的数据
return FALSE;//*(oInByte+i)=0;//
//I2C_InBlockByAck(iIndex,1,oInByte+i);
Delayus(I2CDelayR[5]);
}
if(!I2C_InByteNoAck(iIndex,(oInByte+RSize-1))) // 输入一字节数据,但是不产生应答// 指定USB2I2C设备序号
return FALSE;
//I2C_InByteNoAck(iIndex,(oInByte+RSize-1));
Delayus(I2CDelayR[5]);
if(!I2C_IssueStop(iIndex))
return FALSE;
//USBIO_FlushBuffer( // 清空mUSBIO_PACKET_LENGTH的缓冲区
//iIndex ); // 指定mUSBIO_PACKET_LENGTH设备序号
Delayus(I2CDelayR[5]);
return( TRUE );
} |