《一段用GPIO模拟IIC的参考程序.docx》由会员分享,可在线阅读,更多相关《一段用GPIO模拟IIC的参考程序.docx(6页珍藏版)》请在三一办公上搜索。
1、一段用GPIO模拟IIC的参考程序一段用GPIO模拟IIC的参考程序 /* * 函数名 : * 功能 : 延时等待10 us,循环所需次数跟cpu速度有关 * 输入参数 : * 输出参数 : * 返回值说明 : */ static void DelayXus(U32 xus_n) volatile U32 i,j; i = 110; j = xus_n; for(;j0;j-) for(;i0; i-); /* * 函数名 : * 功能 : 通过IO口模拟IIC时钟线 * 输入参数 : * 输出参数 : * 返回值说明 : */ static void I2cSetSclk(U8 isHigh
2、) if(isHigh) REG BITSET1 = xxxx; /SCLK set to high else REG BITCLR1 = xxxx; /SCLK set to low /* * 函数名 : * 功能 : 通过IO口模拟IIC数据线 * 输入参数 : * 输出参数 : * 返回值说明 : */ static void I2cSetSdin(U8 isHigh) if(isHigh) REG BITSET1 = yyyy; /SDATA set to high else REG BITCLR1 = yyyy; /SDATA set to low /* * 函数名 :I2cChec
3、kAck * 功能 :IIC的ACK周期 * 输入参数 : * 输出参数 : * 返回值说明 : */ static U16 I2cCheckAck(void) U16 retVal_n = 0; retVal_n = (REG BITSET1)&(yyyy); /需要先改变该gpio 为input 模式 return retVal_n; /* * 函数名 : * 功能 : 启动IIC * 输入参数 : * 输出参数 : * 返回值说明 : */ static void I2cStart(void) I2cSetSclk(1); I2cSetSdin(1); DelayXus(1); I2cS
4、etSdin(0); DelayXus(1); I2cSetSclk(0); DelayXus(1); /* * 函数名 : * 功能 : 停止IIC * 输入参数 : * 输出参数 : * 返回值说明 : */ static void I2cStop(void) I2cSetSclk(0); I2cSetSdin(0); DelayXus(1); I2cSetSclk(1); DelayXus(1); I2cSetSdin(1); DelayXus(1); /* * 函数名 :I2cTxByte * 功能 :通过IIC传送一个字节的数据 * 输入参数 : * 输出参数 : * 返回值说明 :
5、 */ static U16 I2cTxByte(U8 txData_n) U16 index_n = 0, retVal_n = 0; I2cSetSclk(0); /force SCLK to low for(index_n=0;index_n8;index_n+) /MSB first if(txData_n&0x80) I2cSetSdin(1); /set SDATA to high else I2cSetSdin(0); /set SDATA to low /SDATA left shift txData_n = 1; I2cSetSclk(1); /force SCLK to h
6、igh DelayXus(1); I2cSetSclk(0); /force SCLK to low DelayXus(1); I2cSetSdin(1); /set SDATA to high I2cSetSclk(1); /force SCLK to high DelayXus(1); retVal_n = I2cCheckAck; I2cSetSclk(0); /force SCLK to low return retVal_n; /* * 函数名 :I2cWriteReg * 功能 :通过IIC完成一次对从设备寄存器的写操作 * 输入参数 : * 输出参数 : * 返回值说明 : */
7、 static U16 I2cWriteReg(U8 devAddr_n, U8 regAddr_n, U8 txData_n) U16 retVal_n = 1; wai_sem(RES_I2C_SEMID); xdisable; / Send start command I2cStart; DelayXus(10); do / Send device code if (I2cTxByte(devAddr_n) = 1) break; DelayXus(10); / Send register code if (I2cTxByte(regAddr_n) = 1) break; DelayXus(10); / Send data if (I2cTxByte(txData_n) = 1) break; DelayXus(10); retVal_n = 0; while(0); / Send stop command I2cStop; DelayXus(10); sig_sem(RES_I2C_SEMID); xenable; return retVal_n;