#include "MYI2C.h"
MYI2C_Struct SENx;
/**********************************************
//MYI2C_Delay_us
**********************************************/
void MYI2C_Delay_us(unsigned long nTim)
{
unsigned int i;
while(nTim--)
{
i=MYI2C_delay_us_cnt;
while(i--);
}
}
/*******************************************************************************
* Function Name : MYI2C_GPIO_MODE
* Description : Configures the different GPIO ports.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void MYI2C_GPIO_MODE(unsigned char TYP) //根据MCU修改相应的IO初始化
{
#ifdef ARM32
GPIO_InitTypeDef GPIO_InitStruct;
#endif
switch(TYP)
{
case SDA_OUT://设置开漏输出,需要加外部上拉电阻
#ifdef ARM32
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStruct.GPIO_Pin =SDA_Pin;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(IIC_SDA_PORT, &GPIO_InitStruct);
#else
P0M0 |= 1<<3; P0M1 |= 3<<2;
#endif
break;
case SDA_IN://设置输入,需要加外部上拉电阻
#ifdef ARM32
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin =SDA_Pin;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(IIC_SDA_PORT, &GPIO_InitStruct);
#else
P0M0 &= ~(1<<3); P0M1 |= 3<<2;
#endif
break;
case SCL_OUT://设置开漏输出,需要加外部上拉电阻
#ifdef ARM32
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStruct.GPIO_Pin =SCL_Pin;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(IIC_SCL_PORT, &GPIO_InitStruct);
#else
P0M0 |= 1<<2; P0M1 |= 3<<2;
#endif
break;
}
}
/*******************************************************************************
* Function Name : MYI2C_GPIO_DATA
* Description : Configures the different GPIO ports.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
unsigned char MYI2C_GPIO_DATA(unsigned char TYP)//根据MCU修改相应的IO操作
{
unsigned int dat=0;
switch(TYP)
{
case SDA_H:
#ifdef ARM32
GPIO_SetBits(IIC_SDA_PORT,SDA_Pin);
#else
I2C_SDA_PIN = 1;
#endif
break;
case SDA_L:
#ifdef ARM32
GPIO_ResetBits(IIC_SDA_PORT,SDA_Pin);
#else
I2C_SDA_PIN = 0;
#endif
break;
case SCL_H:
#ifdef ARM32
GPIO_SetBits(IIC_SCL_PORT,SCL_Pin);
#else
I2C_SCL_PIN = 1;
#endif
break;
case SCL_L:
#ifdef ARM32
GPIO_ResetBits(IIC_SCL_PORT,SCL_Pin);
#else
I2C_SCL_PIN = 0;
#endif
break;
case SDA_R:
#ifdef ARM32
dat=GPIO_ReadInputDataBit(IIC_SDA_PORT,SDA_Pin);
#else
dat=I2C_SDA_PIN;
#endif
break;
}
return dat;
}
/**********************************************
//IIC Start
**********************************************/
void MYI2C_IIC_Start(void)
{
MYI2C_SCK_Set();
MYI2C_SDA_Set();
MYI2C_SDA_Clr();
MYI2C_SCK_Clr();
}
/**********************************************
//IIC Stop
**********************************************/
void MYI2C_IIC_Stop(void)
{
MYI2C_SCK_Clr();
MYI2C_SDA_Clr();
MYI2C_SCK_Set();
MYI2C_SDA_Set();
}
/**********************************************
//IIC Ack
**********************************************/
void MYI2C_IIC_Ack(unsigned char ack)
{
MYI2C_SCK_Clr();
if(ack)
{
MYI2C_SDA_Clr();
}
else
{
MYI2C_SDA_Set();
}
MYI2C_SCK_Set();
}
/**********************************************
//IIC Wait_Ack
**********************************************/
unsigned char MYI2C_IIC_Wait_Ack(unsigned int wait_time)
{
MYI2C_SCK_Clr();
MYI2C_SDA_IN_Mode;
MYI2C_SDA_Set();
MYI2C_SCK_Set();
while(wait_time)
{
if(MYI2C_GPIO_DATA(SDA_R)==0)break;
MYI2C_Delay_us(1);
wait_time--;//=======================
}
MYI2C_SDA_OD_Mode;
return wait_time;//是否应答=======================
}
/**********************************************
// IIC Write byte
**********************************************/
void MYI2C_Write_IIC_Byte(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
MYI2C_SCK_Clr();
if(dat&0x80)
{
MYI2C_SDA_Set();
}
else
{
MYI2C_SDA_Clr();
}
MYI2C_SCK_Set();
dat=dat<<1;
}
}
/**********************************************
// IIC Read byte
**********************************************/
unsigned char MYI2C_Read_IIC_Byte(void)
{
unsigned char i,byt=0;
MYI2C_SCK_Clr();
MYI2C_SDA_IN_Mode;
MYI2C_SDA_Set();
for(i=0;i<8;i++)
{
MYI2C_SCK_Clr();
if(MYI2C_GPIO_DATA(SDA_R))byt++;
MYI2C_SCK_Set();
if(i<7)byt=byt<<1;
}
MYI2C_SDA_OD_Mode;
return byt;
}
/*******************************************************************************
* Function Name : MYI2C_Init
* Description : 初始化MYI2C
* Input : None
* Output : None
* Return :None
*******************************************************************************/
void MYI2C_Init(MYI2C_Struct *pst,unsigned int ReadTimMS,unsigned char xAddr)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能SDA、SCL端口时钟,如是51单片机不需要则注释掉该行。
pst->Adrr=xAddr;
pst->Step=SENSOR_IDLE;
if(ReadTimMS>MinReadTim)pst->SetRTim=ReadTimMS;
else pst->SetRTim=MinReadTim;
MYI2C_SCK_OD_Mode;
MYI2C_SDA_OD_Mode;
MYI2C_SCK_Set();
MYI2C_SDA_Set();
}
/*******************************************************************************
* Function Name :
* Description :
* Input :None
* Output :None
* Return :None
*******************************************************************************/
unsigned char MYI2C_READ_FUNC(MYI2C_Struct *pst,unsigned char device_addr,unsigned char register_addr,unsigned char *pDat,unsigned char len)
{
unsigned char NoAck=0;
if(register_addr)
{
/* Send STRAT condition a second time */
MYI2C_IIC_Start();
/* Send slave address for Write Regsiter */
MYI2C_Write_IIC_Byte((device_addr<<1) + 0);
/* Ack */
if(MYI2C_IIC_Wait_Ack(Wait_Ack_time)==0)NoAck++;
/*Send register_addr*/
MYI2C_Write_IIC_Byte((register_addr));
/* Ack */
if(MYI2C_IIC_Wait_Ack(Wait_Ack_time)==0)NoAck++;
// MYI2C_IIC_Stop(pst);
MYI2C_SCK_Clr();
MYI2C_SCK_Set();
}
/* Send STRAT condition a second time */
MYI2C_IIC_Start();
/* Send slave address for Read */
MYI2C_Write_IIC_Byte((device_addr<<1)+1 );
/* Ack */
if(MYI2C_IIC_Wait_Ack(Wait_Ack_time)==0)NoAck++;
/* While there is data to be read */
while(len && NoAck==0 && len<MYI2C_Buffer_Size) //
{
*pDat=MYI2C_Read_IIC_Byte();
/* Ack */
MYI2C_IIC_Ack(len-1);//len = 1 NoAck
pDat++;
len--;
}
/* Send STOP Condition */
MYI2C_IIC_Stop();
pst->ErrFlag=NoAck;
return NoAck;
}
/*******************************************************************************
* Function Name :
* Description :
* Input : None
* Output : None
* Return :None
*******************************************************************************/
unsigned char MYI2C_WRITE_FUNC(MYI2C_Struct *pst,unsigned char device_addr,unsigned char register_addr,unsigned char *pDat,unsigned char len)
{
unsigned int NoAck=0;
/* Send STRAT condition */
MYI2C_IIC_Start();
/* Send slave address for write */
MYI2C_Write_IIC_Byte((device_addr<<1) + 0);
/* ACK */
if(MYI2C_IIC_Wait_Ack(Wait_Ack_time)==0)NoAck++;
/* Send register_addr for read */
MYI2C_Write_IIC_Byte((register_addr));
/* ACK */
if(MYI2C_IIC_Wait_Ack(Wait_Ack_time)==0)NoAck++;
while(
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
aht20例程(2).zip (3个子文件)
aht20例程
AHT20例程
MYI2C.c 10KB
MYI2C.h 3KB
Main.c 368B
共 3 条
- 1
资源评论
mmzkyh
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 【cocos creator】下拉框
- 基于pytorch实现3D ResNet网络的视频动作分类项目源码+运行说明+模型(支持得分模式和特征模式).zip
- 360国贸纽约城市&女神像.rar
- 更新城市蔓延指数数据集(1990-2023年).xlsx
- datafor3dgs
- 基于Python+Django框架的个性化书籍推荐管理系统开发(程序+万字LW)
- 思科模拟器最新版 CiscoPacketTracer8.2.2
- 安卓大作业-基于AndroidStudio开发的星座app项目源码(高分项目)
- xplore_tehb_v4.39.00_2265.com.apk
- 基于Python和Django框架的个性化书籍推荐管理系统开发
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功