stm32f030 模拟IIC

#define read_SDA (GPIOA->IDR&GPIO_Pin_10) >>10 //PA10 SDA
#define set_SDA GPIO_SetBits(GPIOA, GPIO_Pin_10) //PA10 SDA
#define clr_SDA GPIO_ResetBits(GPIOA, GPIO_Pin_10) //PA10 SDA
#define set_SCL GPIO_SetBits(GPIOA, GPIO_Pin_9) //PA9 SCL
#define clr_SCL GPIO_ResetBits(GPIOA, GPIO_Pin_9) //PA9 SCL

/*******************************************************************************
** IO?ú????
*******************************************************************************/
void IO_Confing(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;//òy??????
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//ê?3??£ê?
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//í?íìê?3??£ê?
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//′?é?à-μ?×è
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//ê?3??ù?è
GPIO_Init(GPIOA, &GPIO_InitStructure);//3?ê??ˉ????

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_9|GPIO_Pin_10);

}
/*******************************************************************************
** SDA?ú????
*******************************************************************************/
void SDA_MODE_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//òy??????
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//ê?è??£ê?
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);//3?ê??ˉ????
}
void SDA_MODE_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//òy??????
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//ê?3??£ê?
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//2?′?é?à-μ?×è
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//ê?3??ù?è
GPIO_Init(GPIOA, &GPIO_InitStructure);//3?ê??ˉ????
}

//*******************************************************************
// ?e?ˉ×ü??oˉêy
//oˉêy?-Dí: void Start_I2c();
//1|?ü: ???ˉI2C×ü??,?′·¢?íI2C?eê?ì??t.
//*******************************************************************
void Start_I2c(void)
{
SDA_MODE_OUT();
clr_SDA; //·¢?í?eê?D?o?
delay_us(2); //?óê±2us
clr_SCL; //?ˉ×?I2C×ü??£?×?±?·¢?í?ò?óê?êy?Y
delay_us(2); //?óê±2us
}
//*******************************************************************
// ?áê?×ü??oˉêy
//oˉêy?-Dí: void Stop_I2c();
//1|?ü: ?áê?I2C×ü??,?′·¢?íI2C?áê?ì??t.
//*******************************************************************
void Stop_I2c(void)
{
SDA_MODE_OUT();
clr_SDA; //·¢?í?eê?D?o?
delay_us(2); //?óê±2us
set_SCL;
delay_us(2); //?óê±2us
set_SDA; //·¢?íI2C×ü???áê?D?o?
delay_us(5); //?óê±5us
}
//********************************************************************
// ó|′e×óoˉêy
//oˉêy?-Dí: void Ack_I2c(bit a);
//1|?ü: ?÷???÷??DDó|′eD?o?(?éò?ê?ó|′e?ò·?ó|′eD?o?£?óé??2?êya???¨)
//********************************************************************
void Ack_I2c(u8 a) //ó|′e?ò??2?ó|′e SDA=0ó|′e£?SDA=1·?ó|′e
{
SDA_MODE_OUT();
clr_SCL; //??ê±?ó??£??ˉ×?I2C×ü??ò?±??ìD??óê?
delay_us(2); //?óê±2us
if(a==0)
clr_SDA; //?ú′?·¢3?ó|′e?ò·?ó|′eD?o?
else
set_SDA;
delay_us(2); //?óê±2us
set_SCL;
delay_us(2); //?óê±2us
clr_SCL; //??ê±?ó??£??ˉ×?I2C×ü??ò?±??ìD??óê?
delay_us(2); //?óê±2us
clr_SDA; //·¢?í?áê?ì??tμ?êy?YD?o?
delay_us(2); //?óê±2us
}
//*******************************************************************
// ×??úêy?Y·¢?íoˉêy
//1|?ü: ??êy?Yc·¢?í3?è¥,?éò?ê?μ??·,ò2?éò?ê?êy?Y,·¢íêoóμè′yó|′e,2¢??
// ′?×′ì?????DD2ù×÷.(2?ó|′e?ò·?ó|′e??ê1ack=0)
// ·¢?íêy?Y?y3££?ack=1; ack=0±íê?±????÷?Tó|′e?ò?e?μ?£
//*******************************************************************
void SendByte(unsigned char dat)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //òa′??íμ?êy?Y3¤?è?a8??
{
if((dat<<BitCnt)&0x80)
set_SDA; //?D??·¢?í??
else
clr_SDA;

delay_us(2); //?óê±2us
set_SCL; //??ê±?ó???a??£?í¨?a±????÷?aê??óê?êy?Y??
delay_us(2); //?óê±3us
clr_SCL;
delay_us(2); //?óê±1us
}
SDA_MODE_IN();
set_SCL;
delay_us(2); //?óê±2us
if(read_SDA==1)
ack=0;
else
ack=1; //?D??ê?·??óê?μ?ó|′eD?o?
clr_SCL;
delay_us(2); //?óê±2us
SDA_MODE_OUT();
delay_us(2); //?óê±2us
clr_SDA;
}

//*******************************************************************
// ×??úêy?Y?óê?oˉêy
//oˉêy?-Dí: UCHAR RcvByte();
//1|?ü: ó?à′?óê?′ó?÷?t′?à′μ?êy?Y,2¢?D??×ü??′í?ó(2?·¢ó|′eD?o?)£?
// ·¢íêoó??ó?ó|′eoˉêyó|′e′ó?ú?£
//*******************************************************************
unsigned char RcvByte(void)
{
unsigned char retc=0;
unsigned char BitCnt;
SDA_MODE_IN();
delay_us(1);
for(BitCnt=0;BitCnt<8;BitCnt++)
{
clr_SCL; //??ê±?ó???aμí£?×?±??óê?êy?Y??
delay_us(2); //?óê±5us
set_SCL; //??ê±?ó???a??ê1êy?Y??é?êy?YóDD§
delay_us(2); //?óê±2us
retc=retc<<1;
if(read_SDA==1)
retc=retc+1; //?áêy?Y??,?óê?μ?êy?Y??·?è?retc?D
delay_us(2); //?óê±2us
}
clr_SCL;
delay_us(2); //?óê±2us
return(retc);
}
//*******************************************************************
// ?òóD×óμ??·?÷?t?áè??à×??úêy?Yoˉêy
//oˉêy?-Dí: bit RecndStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no);
//1|?ü: ′ó???ˉ×ü??μ?·¢?íμ??·£?×óμ??·,?áêy?Y£??áê?×ü??μ?è?1y3ì,′ó?÷?t
// μ??·sla£?×óμ??·suba£??á3?μ??úèY·?è?s???òμ?′?′¢??£??áno??×??ú?£
// è?1?·μ??1±íê?2ù×÷3é1|£?·??ò2ù×÷óD?ó?£
//×¢òa£o ê1ó??°±?D?ò??áê?×ü???£
//********************************************************************
u8 IRcvStr(unsigned char sla,unsigned char *s,unsigned char no)
{
unsigned char i;

Start_I2c(); //???ˉ×ü??
SendByte(sla); //·¢?í?÷?tμ??·
if(ack==0)//?Tó|′e
{
Stop_I2c();
return 0;
}
for(i=0;i<no-1;i++)
{
*s=RcvByte(); //
Ack_I2c(0); //?óê??í′e??
s++;
}
*s=RcvByte();
Ack_I2c(1); //·¢?í·?ó|??
Stop_I2c(); //?áê?×ü??
return 1;
}

时间: 2024-11-05 11:25:43

stm32f030 模拟IIC的相关文章

stm32软件模拟IIC读取PX4FLOW光流传感器数据

这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模拟iic的时序要求可能更高一点所以在原子哥的iic程序上做了修改,代码测验后已经不会死机,做个笔记,保存一下. 1 #include "myiic.h" 2 #include "delay.h" 15 16 //初始化IIC 17 void IIC_Init(void)

lpc1788IO口模拟IIC

#ifndef __MYIIC_H_ #define __MYIIC_H_ #include "common.h" #include "delay.h" #include "debugserial.h" //sda 027 scl 028 //IO方向设置 #define IIC1_SDA_IN()  P0dir(27) = 0 #define IIC1_SDA_OUT() P0dir(27) = 1 //IO操作函数 #define IIC1_

单片机模拟 IIC 总线与 EEPROM(AT24C02)通信

数据有效性: 起始和终止信号时序: 设备地址: 写字节时序: 读数据时序: 函数模拟 IIC 总线 时序: /**************************************/ /******模拟I2C总线操作函数*************/ /**************************************/ //延时函数 void Delay() { ; ; } //初始化 void I2C_Init() { SDA = 1; SCL = 1; } //起始信号 vo

用s5pc100的GPIO模拟IIC

转载:http://blog.chinaunix.net/uid-26833883-id-3823530.html 一.硬件连线 先来看看LM75硬件的上的连线: 其中I2C_SDA0是数据线,I2C_SCL0是时钟线,它们分别接到s5pc100的GPD3和GPD4,如下图所示 在模拟IIC的时候,用GPD3引脚发送数据或读取数据,用GPD4引脚提供时钟信号即可. 二.数据结构 由于s5pc100的GPD这一组的引脚很多,不好单独对其中的某一个引脚操作,为了能单独对其中的某一个管脚单独操作,这里

模拟IIC协议时序

IIC是飞利浦公司开发的两线式串行总线,主要应用在单片机和外围电子器件之间的数据通讯. IIC总线优点是节约总线数,稳定,快速,是目前芯片制造上非常流行的一种总线,大多数单片机已经片内集成了IIC总线接口,无需用户自己模拟,只需配置相关寄存器即可使用,但是,为了更好地理解IIC总线协议,可以自行按照IIC时序图进行模拟,加深理解. IIC总线有两条串行线,其一是时钟线SCK,其二是数据线SDA. 在寻常的应用之中,单片机常常作为主机,外围器件作为从机使用. 每一个从机器件都拥有唯一的一个地址,这

GPIO模拟IIC接口信号质量分析

信号质量有问题的波形001: 信号质量有问题的波形002: 从上图可以看出,GPIO口模拟的I2C接口,电平都存在半高的情况. 因为MFI芯片的I2C采用的GPIO口模拟I2C接口来实现的此功能,原SCL采用的GPB7(内部默认为上拉状态),因为GPIO资源的调整,SCL改为GPD12(内部默认为下拉状态),因SCL对应的GPIO口内部有下拉电阻,导致在输出为高电平时,上升沿慢的台阶出现.软件后面把GPD12的内部下拉电阻disable之后,测试的波形如上图所示,从上图可以看出SCL时钟信号已经

NRF51822之模拟IIC

使用的工程为是基于sdk10工程 在将以nRF51_SDK_10.0.0_dc26b5e\examples\peripheral\twi_sensor作为模版 修改代码main.c 1 #include <stdio.h> 2 #include "boards.h" 3 #include "app_util_platform.h" 4 #include "app_error.h" 5 #include "nrf_drv_tw

STM32中的模拟IIC使用

起始信号:SCLK为高的时候,SDA从高向低跳变. SDA_OUT(); //sda线输出 IIC_SDA=1; IIC_SCL=1; delay_us(4); IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4); IIC_SCL=0;//钳制SCL总线,准备发送和接受数据. 停止信号:SCLK为高的时候,SDA从低向高跳变.

IIC

1. 模拟IIC,读取BH1750光强传感器!-STM32-F0/F1/F2专区-OpenEdv-开源电子网 http://www.openedv.com/posts/list/31163.htm 2. [转载]IIC总线时序_piqiuarm_新浪博客 http://blog.sina.com.cn/s/blog_78d30f6b0101591v.html