I/O口模拟I2C驱动代码
2014-07-15 14:05
423 查看
此I2C代码是通用代码。不是什么高难度技术。
头文件 I2C.H :
#ifndef _I2C_H
#define _I2C_H
//定义函数
void I2C_Initial(void);
void I2C_Set_sda_high(void);
void I2C_Set_sda_low (void);
void I2C_Set_sck_high(void);
void I2C_Set_sck_low (void);
BYTE I2C_GetACK(void);
void I2C_SetACK(void);
void I2C_SetNAk(void);
void I2C_START(void);
void I2C_STOP(void);
void I2C_TxByte(BYTE);
BYTE I2C_RxByte(void);
BYTE WriteSingleByte(BYTE nAddr,BYTE nValue);
BYTE PageWrite(BYTE nAddr,BYTE *pBuf);
BYTE ReadRandom(BYTE nAddr, BYTE *nValue);
BYTE ReadSeq(BYTE nAddr,BYTE *nValue,BYTE nLen);
#endif
源文件 I2C.C :
/*******************************************************************************
* 版权所有 (C)2007,XXXXXXXX。
*
* 文件名称:XXXXXX
* 文件标识:
* 内容摘要:
* 其它说明:
* 当前版本:1.0
* 作 者:XXXX
* 开始日期:XXXX年XX月XX日
*
* 修改记录1:
* 修改日期:
* 版 本 号:
* 修 改 人:
* 修改内容:
* 修改记录2:…
*******************************************************************************/
/*******************************************************************************
// 模块运行环境配置
*******************************************************************************/
#include "AX5051_subject.h"
#include "AX5051_Registers.h"
#include "AX5051_device.h"
/*******************************************************************************
// 模块内部定义
*******************************************************************************/
/*******************************************************************************
// 模块内部变量
*******************************************************************************/
/*******************************************************************************
* 函数名称:I2C_Set_sda_low
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_Set_sda_low(void)
{
RTC_I2C_CMD_PxDIR |= SDA; //将SDA设置为输出模式
RTC_I2C_CMD_PxOUT &= ~(SDA); //SDA管脚输出为低电平
_NOP();
_NOP();
}
/*******************************************************************************
* 函数名称:I2C_Set_sda_high
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_Set_sda_high( void )
{
RTC_I2C_CMD_PxDIR |= SDA; //将SDA设置为输出模式
RTC_I2C_CMD_PxOUT |= SDA; //SDA管脚输出为高电平
_NOP();
_NOP();
}
/*******************************************************************************
* 函数名称:I2C_Set_sck_high
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_Set_sck_high( void )
{
P4OUT |= SCL; //SCL管脚输出为高电平
_NOP();
_NOP();
}
/*******************************************************************************
* 函数名称:I2C_Set_sck_low
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_Set_sck_low ( void )
{
P4OUT &= ~(SCL); //SCL管脚输出为低电平
_NOP();
_NOP();
}
/*******************************************************************************
* 函数名称:I2C_STOP
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_STOP(void)
{
BYTE i;
I2C_Set_sck_low();
I2C_Set_sda_low();
for(i = 5;i > 0;i--);
I2C_Set_sck_high();
for(i = 5;i > 0;i--);
I2C_Set_sda_high();
}
/*******************************************************************************
* 函数名称:I2C_Initial
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_Initial( void )
{
RTC_I2C_CMD_PxDIR |= WP; //写使能
P4OUT &= ~(WP);
RTC_I2C_CMD_PxDIR |= SCL; //将SCL管脚(P4.6)设置为输出管脚
I2C_Set_sck_high();
I2C_STOP();
}
/*******************************************************************************
* 函数名称:I2C_START
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_START(void)
{
BYTE i;
I2C_Set_sda_high();
I2C_Set_sck_high();
for(i = 5;i > 0;i--);
I2C_Set_sda_low();
for(i = 5;i > 0;i--);
I2C_Set_sck_low();
}
/*******************************************************************************
* 函数名称:I2C_GetACK
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
BYTE I2C_GetACK(void)
{
BYTE nTemp = 0;
BYTE j;
_NOP();
_NOP();
I2C_Set_sck_low();
for(j = 10;j > 0;j--);
RTC_I2C_CMD_PxDIR &= ~(SDA); //将SDA设置为输入方向
_NOP();
_NOP();
I2C_Set_sck_high();
for(j = 10;j > 0;j--);
nTemp = P4IN & SDA; //获得数据
I2C_Set_sck_low();
return (nTemp);
}
/*******************************************************************************
* 函数名称:I2C_SetACK
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_SetACK(void)
{
BYTE j;
I2C_Set_sda_low();
I2C_Set_sck_high();
for(j = 10;j > 0;j--);
I2C_Set_sck_low();
}
/*******************************************************************************
* 函数名称:I2C_SetNAk
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_SetNAk(void)
{
BYTE j;
I2C_Set_sda_high();
I2C_Set_sck_high();
for(j = 10;j > 0;j--);
I2C_Set_sck_low();
}
/*******************************************************************************
* 函数名称:I2C_TxByte
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_TxByte(BYTE nValue)
{
BYTE i;
BYTE j;
for(i = 0;i < 8;i++)
{
I2C_Set_sck_low();
if(nValue & 0x80)
I2C_Set_sda_high();
else
I2C_Set_sda_low();
nValue <<= 1;
for(j = 10;j > 0;j--);
I2C_Set_sck_high();
}
}
/*******************************************************************************
* 函数名称:I2C_RxByte
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
BYTE I2C_RxByte(void)
{
BYTE nTemp = 0;
BYTE i;
BYTE j;
RTC_I2C_CMD_PxDIR &= ~(SDA); //将SDA管脚设置为输入方向
_NOP();
_NOP();
_NOP();
_NOP();
for(i = 0;i < 8;i++)
{
I2C_Set_sck_low();
for(j = 10;j > 0;j--);
I2C_Set_sck_high();
for(j = 10;j > 0;j--);
if(P4IN & SDA)
{
nTemp |= (0x80 >> i);
}
}
I2C_Set_sck_low();
return nTemp;
}
头文件 I2C.H :
#ifndef _I2C_H
#define _I2C_H
//定义函数
void I2C_Initial(void);
void I2C_Set_sda_high(void);
void I2C_Set_sda_low (void);
void I2C_Set_sck_high(void);
void I2C_Set_sck_low (void);
BYTE I2C_GetACK(void);
void I2C_SetACK(void);
void I2C_SetNAk(void);
void I2C_START(void);
void I2C_STOP(void);
void I2C_TxByte(BYTE);
BYTE I2C_RxByte(void);
BYTE WriteSingleByte(BYTE nAddr,BYTE nValue);
BYTE PageWrite(BYTE nAddr,BYTE *pBuf);
BYTE ReadRandom(BYTE nAddr, BYTE *nValue);
BYTE ReadSeq(BYTE nAddr,BYTE *nValue,BYTE nLen);
#endif
源文件 I2C.C :
/*******************************************************************************
* 版权所有 (C)2007,XXXXXXXX。
*
* 文件名称:XXXXXX
* 文件标识:
* 内容摘要:
* 其它说明:
* 当前版本:1.0
* 作 者:XXXX
* 开始日期:XXXX年XX月XX日
*
* 修改记录1:
* 修改日期:
* 版 本 号:
* 修 改 人:
* 修改内容:
* 修改记录2:…
*******************************************************************************/
/*******************************************************************************
// 模块运行环境配置
*******************************************************************************/
#include "AX5051_subject.h"
#include "AX5051_Registers.h"
#include "AX5051_device.h"
/*******************************************************************************
// 模块内部定义
*******************************************************************************/
/*******************************************************************************
// 模块内部变量
*******************************************************************************/
/*******************************************************************************
* 函数名称:I2C_Set_sda_low
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_Set_sda_low(void)
{
RTC_I2C_CMD_PxDIR |= SDA; //将SDA设置为输出模式
RTC_I2C_CMD_PxOUT &= ~(SDA); //SDA管脚输出为低电平
_NOP();
_NOP();
}
/*******************************************************************************
* 函数名称:I2C_Set_sda_high
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_Set_sda_high( void )
{
RTC_I2C_CMD_PxDIR |= SDA; //将SDA设置为输出模式
RTC_I2C_CMD_PxOUT |= SDA; //SDA管脚输出为高电平
_NOP();
_NOP();
}
/*******************************************************************************
* 函数名称:I2C_Set_sck_high
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_Set_sck_high( void )
{
P4OUT |= SCL; //SCL管脚输出为高电平
_NOP();
_NOP();
}
/*******************************************************************************
* 函数名称:I2C_Set_sck_low
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_Set_sck_low ( void )
{
P4OUT &= ~(SCL); //SCL管脚输出为低电平
_NOP();
_NOP();
}
/*******************************************************************************
* 函数名称:I2C_STOP
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_STOP(void)
{
BYTE i;
I2C_Set_sck_low();
I2C_Set_sda_low();
for(i = 5;i > 0;i--);
I2C_Set_sck_high();
for(i = 5;i > 0;i--);
I2C_Set_sda_high();
}
/*******************************************************************************
* 函数名称:I2C_Initial
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_Initial( void )
{
RTC_I2C_CMD_PxDIR |= WP; //写使能
P4OUT &= ~(WP);
RTC_I2C_CMD_PxDIR |= SCL; //将SCL管脚(P4.6)设置为输出管脚
I2C_Set_sck_high();
I2C_STOP();
}
/*******************************************************************************
* 函数名称:I2C_START
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_START(void)
{
BYTE i;
I2C_Set_sda_high();
I2C_Set_sck_high();
for(i = 5;i > 0;i--);
I2C_Set_sda_low();
for(i = 5;i > 0;i--);
I2C_Set_sck_low();
}
/*******************************************************************************
* 函数名称:I2C_GetACK
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
BYTE I2C_GetACK(void)
{
BYTE nTemp = 0;
BYTE j;
_NOP();
_NOP();
I2C_Set_sck_low();
for(j = 10;j > 0;j--);
RTC_I2C_CMD_PxDIR &= ~(SDA); //将SDA设置为输入方向
_NOP();
_NOP();
I2C_Set_sck_high();
for(j = 10;j > 0;j--);
nTemp = P4IN & SDA; //获得数据
I2C_Set_sck_low();
return (nTemp);
}
/*******************************************************************************
* 函数名称:I2C_SetACK
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_SetACK(void)
{
BYTE j;
I2C_Set_sda_low();
I2C_Set_sck_high();
for(j = 10;j > 0;j--);
I2C_Set_sck_low();
}
/*******************************************************************************
* 函数名称:I2C_SetNAk
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_SetNAk(void)
{
BYTE j;
I2C_Set_sda_high();
I2C_Set_sck_high();
for(j = 10;j > 0;j--);
I2C_Set_sck_low();
}
/*******************************************************************************
* 函数名称:I2C_TxByte
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
void I2C_TxByte(BYTE nValue)
{
BYTE i;
BYTE j;
for(i = 0;i < 8;i++)
{
I2C_Set_sck_low();
if(nValue & 0x80)
I2C_Set_sda_high();
else
I2C_Set_sda_low();
nValue <<= 1;
for(j = 10;j > 0;j--);
I2C_Set_sck_high();
}
}
/*******************************************************************************
* 函数名称:I2C_RxByte
* 功能描述:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
BYTE I2C_RxByte(void)
{
BYTE nTemp = 0;
BYTE i;
BYTE j;
RTC_I2C_CMD_PxDIR &= ~(SDA); //将SDA管脚设置为输入方向
_NOP();
_NOP();
_NOP();
_NOP();
for(i = 0;i < 8;i++)
{
I2C_Set_sck_low();
for(j = 10;j > 0;j--);
I2C_Set_sck_high();
for(j = 10;j > 0;j--);
if(P4IN & SDA)
{
nTemp |= (0x80 >> i);
}
}
I2C_Set_sck_low();
return nTemp;
}
相关文章推荐
- Linux I2C Input设备驱动代码的几点理解
- i2c设备驱动(ds1337实例:内核代码)
- I2C软件模拟驱动
- STM32F103利用模拟I2C驱动ADS1115
- STM32F103下模拟I2C的接口代码
- 并口模拟I2C、SPI总线驱动的LED点阵
- C51IO口模拟I2C总线驱动AT24C16 (I2C协议部分)
- gpio模拟I2C,驱动pcf8574T
- gpio模拟i2c驱动
- i2c驱动--代码
- 基于visual c++之windows核心编程代码分析(34)WinIo驱动级模拟按键的实现
- mini2440 入门块设备驱动(用RAM缓存模拟磁盘)代码记录(内核用的是2.6.32.2)
- davinci平台的I2C驱动(非GPIO口模拟i2c)
- MTK I2C驱动代码分析
- 展讯智能机平台代码i2c设备驱动解读(上)
- I2C的内核驱动测试代码
- I2C-dev.c驱动代码分析
- FPGA音频编解码驱动及I2C写入代码
- IIC专题(二)-使用内核原代码提供的at24.c驱动来操作I2C的at24lc04 EEPROM
- STM8 模拟I2C驱动0.91寸OLED屏