stm32f030 模拟i2c的I2C发送数据疑惑 求解答

STM32F030F4数据手册_中华文本库
第1页/共88页
43F0Mx00x3T332T 0S2FSM6
08F3S0T32Mx
mCFtbiU lti
w 6-bKo,laM A sRihthM4seee-u, 6 l sB1ni2-r-tdaae3V
cii.to2nmmutA eer4n,t-ciosco pa63DinV n .fo ,areaC
aesce eoDicthtneafpat ratigsit
Axt ,CMCMP:tR(TM)b(R)ri0U-eC o2?r3oe
?mMee4npMutiezr8yuc f r Hos oqe
le6o1eo rK6mmyhtstb4sof y F a –
tSg la8Reeuspti KHi iaW yc wtiMhi bChRntlo?onc fC uo–ka Atyr4ct nc
ndtaalr:oo r
VagtsotennVm
g–2V.n mgeRe.e4eaawtpe6?e3
oSPooPe) rk o,n
w -,sR/dLpe–o l(amwenemsCgdor ?nSmeSn/pwP:ettrcOybeeRdrDwt–eaPopanltoe w o
t–lotal3Moc atzs 2iH4o yrcrsl
CtO kolR ?af/3itnLno a5nlTai2L –rtooksnboaitHt RnHt hcCH ac6 8 5l Iroio–I Urh4sMxrlilfclpesez p ttw0z aio–rI sCtr wanzRtl iPo
cb avletiert–cxnUalOetprcnt to /MoAVtrlillspttninnpwo ey - aeh–espopr
rI? t en5obcih areoaau 63mDl5Anll alt r
1V –C(.-u11ur?ions tes6ox0 apvAe h long t.in,601s
)c3DCt 2 broann:e
se 40Uy.o1tr–a rafm
ml uipoSpep teo?a2s g36Vu tor
bft vunnas t pat,- r ea
tI angrIr,if tnpcoro6oweCe-eo–in lbrnm4dnhie
ue1el csmcb
onnt6aCR1d sl- cOe/oMcl7m-ahtgnrr6iwt Oupyhea rnheioetmotntec octidP ietdOn t–oeidea dleog,n
I rCt /eOeun1Inlmo g1ew–6rdt spnaItd–teboc- ibOmNtcwCe Cneri g agn e, 6iiedi Cmm antoNi2roo/amootm e angyOai ,O iesdn e,O- lte–
n1 1e baIe,tT
ht ahtttr rmsCayiCandei-CfhpttOt dnctiR 6oc/eOe1errio,mnd
t rrheoe,ew
tgh nonsywscsndeSa-e 2ecItd nd4nko b r i:mmrttied–potyetTmetcnsde–iar wiu
cdaoue neniaitC/kt tbyipuSef ? Chaamdrri fdltpm e naomneos
pCRrrcwonadiw? cmnaltSrTaaoi
wissgtmcItsr)hecnpo eeu tbprsu1ftMo (
n0Foaw2r o n teu psitMe:/ nl t2idi tnU srik–AoaCP
ew o ArsSpUa–pRgt smtnuptsor TitoU
dnto oeo tniteatmrae muh sPr owcen nhoS dit
rcela oboosydcIn
a ?4l riUout Swap 1 rotb1sPe/ oM wmett S merhlD(t6gibrfbo8s ie)dbet iS a W )Iigpawr(m–
lDrvecm1 aemuyi ebas.T
eurbm Panrt
402MTSF33F0
0 TFMT0C0M2,F3C3S6,8RMK330S2 23TFF320M
3M02T0F0FxM3F36TxSMT0S
911Icu832Rl/ 04DyJo
wsw.tcm.ow
第1页/共88页
寻找更多 ""> STM32----5----I2C(上)
管理员:&&&&&人数:6622小组积分:71971简介:欢迎进入STM32小组,学习讨论相关技术、交换资料、交流学习经验和设计心得。QQ群:小组公告福利:免费申请STM32F0308-DISCO开发套件(Discovery kit with STM32F030R8 MCU) 活动马上开始,只需2分钟即可申请。申请地址:&&|&&&&|&&
需要确认注册邮箱后才能下载,
楼主&&[其他]&
STM32----5----I2C(上)
4年会员勋章目前未领取。领取条件:&凡是注册时间四年以上的活跃用户即可领取该勋章。
积分:306分
总积分:640分
发表于 11:23
I2C的协议就不讲了,网上多的很,我们关键在于利用STM32的GPIO模拟出I2C:I2C.h#ifndef __IIC_H#define __IIC_H#include "stm32f10x_lib.h"/*********************************************************&- I2C 宏定义:&- 软件模拟I2C时的管脚,用PC12模拟CLK,用PC11模拟SDA&- 所以在应用的时候,要打开GPIOC的时钟&&& *********************************************************/#define IIC_SCL_PORT&&&&&&&&&&&&& GPIOC#define IIC_SCL_CLK&&&&&&&&&&&&&& RCC_APB2Periph_GPIOC& #define IIC_SCL_PIN&&&&&&&&&&&&&& GPIO_Pin_12#define IIC_SDA_PORT&&&&&&&&&&&&& GPIOC#define IIC_SDA_CLK&&&&&&&&&&&&&& RCC_APB2Periph_GPIOC& #define IIC_SDA_PIN&&&&&&&&&&&&&& GPIO_Pin_11/*********************************************************&- I2C宏定义:&- SDA方向设置:&&& -&SDA_IN(): 此处是将SDA定义为配置为输入模式&-&SDA_OUT():此处是将SDA_OUT配置为推挽输出模式&说明:这里是配置的快速写法,当然也可以用库函数初始化,&&& 因为IIC的SDA线,即要作为输入也要作为输出。&&&&&&& *********************************************************/&& &&&& #define SDA_IN()& {GPIOC-&CRH&=0XFFFF0FFF;GPIOC-&CRH|=8&&12;}#define SDA_OUT() {GPIOC-&CRH&=0XFFFF0FFF;GPIOC-&CRH|=3&&12;}/*********************************************************&- I2C宏定义:&- I2C时钟操作:&&& - Set_IIC_SCL: 此处是将SCL拉为高电平&- Clr_IIC_SCL: 此处是将SCL拉为低电平&- 说明:通过这两个宏定义就可以模拟IIC的时钟电平SCL的高低变化了&&&& *********************************************************/#define Set_IIC_SCL& {GPIO_SetBits(IIC_SCL_PORT,IIC_SCL_PIN);}#define Clr_IIC_SCL& {GPIO_ResetBits(IIC_SCL_PORT,IIC_SCL_PIN);} /*********************************************************&- I2C宏定义:&- I2C数据线操作:&&& - Set_IIC_SDA: 此处是将SDA拉为高电平&- Clr_IIC_SDA: 此处是将SDA拉为低电平&- READ_SDA& : 此处是读取SDA线上的位数据&- 说明:通过这两个宏定义就可以模拟IIC的数据线SDA电平的高低变化了&&&& *********************************************************/#define Set_IIC_SDA& {GPIO_SetBits(IIC_SDA_PORT,IIC_SDA_PIN);}#define Clr_IIC_SDA& {GPIO_ResetBits(IIC_SDA_PORT,IIC_SDA_PIN);} #define READ_SDA&&& (GPIO_ReadInputDataBit(IIC_SDA_PORT, IIC_SDA_PIN))& /*********************************************************&- I2C模拟操作函数的声明:&& *********************************************************///IIC所有操作函数void IIC_Init(void);&&&&&&&&&&&&&&& //初始化IIC的IO口&&&& void IIC_Start(void);&&&&//发送IIC开始信号void IIC_Stop(void);&& &&&//发送IIC停止信号void IIC_Send_Byte(u8 txd);&&&//IIC发送一个字节u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节u8 IIC_Wait_Ack(void); &&&&//IIC等待ACK信号void IIC_Ack(void);&&&&&//IIC发送ACK信号void IIC_NAck(void);&&&&//IIC不发送ACK信号/*********************************************************&- I2C外部操作函数的声明:&& *********************************************************/void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);u8 IIC_Read_One_Byte(u8 daddr,u8 addr);&& #endifI2C .c#include "i2c.h"#include "delay.h"/***************************************************************************&&& - 功能描述:STM32f103 模拟IIC初始化函数&&& - 隶属模块:STM32 IIC操作&&- 函数属性:外部,使用户使用&&- 参数说明:无&&- 返回说明:无&&& - 函数实现步骤:&&(1) 配置好模拟IIC的PC11和PC12的引脚状态&&(2)并打开时钟&&(3)将SCL和SDA拉为高电平,使总线处于空闲状态***************************************************************************/void IIC_Init(void){&&&&&&&&& &GPIO_InitTypeDef GPIO_InitS&RCC_APB2PeriphClockCmd(&RCC_APB2Periph_GPIOC, ENABLE );&&//打开GPIOC的时钟&&&&& &&& &GPIO_InitStructure.GPIO_Pin = IIC_SCL_PIN;&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; &GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;&GPIO_Init(IIC_SCL_PORT, &GPIO_InitStructure);&//配置SCL,也就是PC12为推挽输出模式&GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;&GPIO_Init(IIC_SDA_PORT, &GPIO_InitStructure);&//配置SDA,也就是PC11为浮空输入模式&Set_IIC_SCL;&Set_IIC_SDA;&//将SCL和SDA都拉为高电平,表示IIC总线处于高电平}/***************************************************************************&&& - 功能描述:STM32f103 模拟IIC起始信号函数&&& - 隶属模块:STM32 IIC操作&&- 函数属性:外部,使用户使用&&- 参数说明:无&&- 返回说明:无&&& - 函数实现步骤:&&(1)首先将SDA配置为输出&&(2)在SCL为高电平期间,SDA有下降沿的变化***************************************************************************/void IIC_Start(void){&SDA_OUT();&&&& //sda线输出&Set_IIC_SDA;&& && &Set_IIC_SCL;&delay_us(4);&&Clr_IIC_SDA;//START:when CLK is high,DATA change form high to low &delay_us(4);&Clr_IIC_SCL;//钳住I2C总线,准备发送或接收数据 }&& /***************************************************************************&&& - 功能描述:STM32f103 模拟IIC终止信号函数&&& - 隶属模块:STM32 IIC操作&&- 函数属性:外部,使用户使用&&- 参数说明:无&&- 返回说明:无&&& - 函数实现步骤:&&(1)首先将SDA配置为输出&&(2)在SCL为高电平期间,SDA有上升沿的变化***************************************************************************/void IIC_Stop(void){&SDA_OUT();//sda线输出&Clr_IIC_SCL;&Clr_IIC_SDA;//STOP:when CLK is high DATA change form low to high&&delay_us(4);&Set_IIC_SCL; &Set_IIC_SDA;//发送I2C总线结束信号&delay_us(4);&&&&&&&&& &}/***************************************************************************&&& - 功能描述:STM32f103 模拟IIC等待应答函数&&& - 隶属模块:STM32 IIC操作&&- 函数属性:外部,使用户使用&&- 参数说明:无&&&&- 返回说明:返回值:1,接收应答失败;0,接收应答成功&&& - 函数说明:&&(1)首先将SDA配置为输入&&(2)如果返回0,表示接收应答成功;如果为1,接收应答失败&&(3)注意在IIC_STOP()中&,将SDA置为了输出,所以再满足250条件后,产中IIC停止线号,&&& 对输出线SDA读SDA输入值是为0的,所以才退出循环。&&(4)此函数为STM32主机等待从机的ACK函数***************************************************************************/u8 IIC_Wait_Ack(void){&u8 ucErrTime=0;&SDA_IN();&&&&& //SDA设置为输入& &Set_IIC_SDA;delay_us(1);&&& &Set_IIC_SCL;delay_us(1);& &while(READ_SDA)&{&&ucErrTime++;&&if(ucErrTime&250)&&{&&&IIC_Stop();&&&return 1;&&}&}&Clr_IIC_SCL;//时钟输出0 &&& &return 0;& } /***************************************************************************&&& - 功能描述:STM32f103 模拟IIC应答信号函数&&& - 隶属模块:STM32 IIC操作&&- 函数属性:外部,使用户使用&&- 参数说明:无&&- 返回说明:无&&& - 函数实现步骤:&&(1)首先将SDA配置为输出&&(2)在SCL的一个时钟周期期间,SDA为低 &&(3)此函数为STM32主机向从机发送ACK函数***************************************************************************///产生ACK应答void IIC_Ack(void){&Clr_IIC_SCL;&SDA_OUT();&Clr_IIC_SDA;&delay_us(2);&Set_IIC_SCL;&delay_us(2);&Clr_IIC_SCL;}/***************************************************************************&&& - 功能描述:STM32f103 模拟IIC不应答信号函数&&& - 隶属模块:STM32 IIC操作&&- 函数属性:外部,使用户使用&&- 参数说明:无&&- 返回说明:无&&& - 函数实现步骤:&&(1)首先将SDA配置为输出&&(2)在SCL的一个时钟周期期间,SDA为高电平&&(4)此函数为STM32主机不向从机发送ACK***************************************************************************/&&&& void IIC_NAck(void){&Clr_IIC_SCL;&SDA_OUT();&Set_IIC_SDA;&delay_us(2);&Set_IIC_SCL;&delay_us(2);&Clr_IIC_SCL;}&&&&& &&&&&&&& /***************************************************************************&&& - 功能描述:STM32f103 模拟IIC 发送一个字节函数&&& - 隶属模块:STM32 IIC操作&&- 函数属性:外部,使用户使用&&- 参数说明:无&&- 返回说明:无&&& - 函数实现步骤:&&(1)首先将SDA配置为输出&&(2)在SCL为低电平期间,置位SDA的数据为0或者1,延时后拉高SCL,取走数据,循环8次***************************************************************************/&&& void IIC_Send_Byte(u8 txd){&&&&&&&&&&&&&&&&&&&&&&& &&& u8&& &SDA_OUT(); &&&& &&& Clr_IIC_SCL;//拉低时钟开始数据传输&&& for(t=0;t&8;t++)&&& {&&&&&&&&&&&&& &&&&&&& //IIC_SDA=(txd&0x80)&&7;&&if ((txd&0x80)&&7) &&&&Set_IIC_SDA&&else Clr_IIC_SDA;&&&&&&& &txd&&=1; && &&delay_us(2);&& &&Set_IIC_SCL;&&delay_us(2); &&Clr_IIC_SCL;&&&delay_us(2);&&& }& } /***************************************************************************&&& - 功能描述:STM32f103 模拟IIC 发送一个字节函数&&& - 隶属模块:STM32 IIC操作&&- 函数属性:外部,使用户使用&&- 参数说明:ack 用于决定是是否回应ACK&&- 返回说明:无&&& - 函数实现步骤:&&(1)首先将SDA配置为输入&&(2)在SCL的一个时钟周期后,读SDA的数据,保存在receive中&&(3)读1个字节,ack=1时,发送ACK,ack=0,发送nACK& ***************************************************************************/&&&&& u8 IIC_Read_Byte(unsigned char ack){&unsigned char i,receive=0;&SDA_IN();//SDA设置为输入&&& for(i=0;i&8;i++ )&{&&&&&&& Clr_IIC_SCL; &&&&&&& delay_us(2);&&Set_IIC_SCL;&&&&&&& receive&&=1;&&&&&&& if(READ_SDA)receive++;&& &&delay_us(1); &&& }&&&&& &&& if (!ack)&&&&&&& IIC_NAck();//发送nACK&&& else&&&&&&& IIC_Ack(); //发送ACK&& &&&}&&上面的函数,把STM32作为主机时I2C的功能已经全部描述了出来,至于操作什么I2C器件,那就需要该I2C的驱动函数了。&&&&&&&&&&&&&&&&&&
Step 编辑于 11:22
--- 现有 1个主题,共 1页,目前第 1页 ---&&
点击,立即回复。
EDN China官方微信
扫一扫关注,获取电子新知,设计灵感
IC厂商小组
在线研讨会
赞助商链接
2016 EDN China -- Use of this website is subject to its terms of use.
京ICP备号-4 |
京公网安备37 |stm32f030涓璧-共享资料网
> stm32f030涓璧
All rights reserved Powered by
copyright &copyright 。共享资料网内容来自网络,如有侵犯请联系客服。}

我要回帖

更多关于 stm32f030 模拟i2c 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信