while(i2cRead(0x3B,i2cData,14));这是包括在哪个stm8 i2c 库函数数里的?

I2C通讯的C语言程序_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
I2C通讯的C语言程序
上传于|0|0|文档简介
&&I2C通讯的C语言程序
你可能喜欢I2C通讯的C语言程序
I2C通讯的C语言程序
发布时间: 21:51:33
编辑:www.fx114.net
本篇文章主要介绍了"I2C通讯的C语言程序",主要涉及到I2C通讯的C语言程序方面的内容,对于I2C通讯的C语言程序感兴趣的同学可以参考一下。

#include &INTRINS.H&
#include &stdio.h&
#include &reg51.h&
sbit SCK=0x91;//时钟线端口
sbit SDA=0x90;//数据线端口
#define& I2C_Address 0xa0 //I2C芯片地址
#define& nop _nop_()&&
#define& NOPnop//延时应大于4.7us
//开始信号
//在时钟线为高电平时,数据线由高向低跳变.&
void StartI2C(void)
{&& SCK=1;
&&& SDA=1;
&&& SDA=0;
&&& SCK=0;
//停止信号
//在时钟线为高电平时,数据线由低向高跳变.
void StopI2C(void)
{&& SDA=0;
&&& SCK=1;
&&& SDA=1;
//发送一个字节.
bit SendChar(unsigned char SendData)
&&& bit ACK;
&&& for(i=0;i&8;i++)
&&& {&& if((SendData&&i)&0x80)SDA=1;
&&&&&&& else SDA=0;
&&&&&&& SCK=1;
&&&&&&& NOP;
&&&&&&& SCK=0;
&&&&&&& NOP;
//发送一个字节后,读取来自I2C芯片的响应.
//即在发送完8个字节后,在第九个时钟内,SDA总线应为低电平,表示I2C芯片已经读取了数据.
//否则为高电平.即发送收败.
&&& SDA=1;
&&& SCK=1;
&&& ACK=SDA;
&&& SCK=0;
&&& return ACK;
//在读取完来自I2C的8位数据后,发出读取正确位.
//即发送一个低电平,表示已经读取到来自I2C的数据,并允许I2芯片发送下一字节.
void ACK(void)
{&& SDA=0;
&&& SCK=1;
&&& SCK=0;
//在读取完来自I2C的8位数据后,发送不响应位.
//即发送一个高电平,表示已经读取完来自I2C的数据,并且不允许I2C发送下一字节.
void NAK(void)
&&& SDA=1;
&&& SCK=1;
&&& SCK=0;
//读入一个字节的数据.
unsigned char ReadChar(void)
{&& unsigned char i,BackD
&&& BackData=0;
&&& SDA=1;
&&& for(i=0;i&8;i++)
&&& {&& SCK=1;
&&&&&&& BackData=BackData&&1;
&&&&&&& if(SDA)BackData++;
&&&&&&& SCK=0;
&&& return BackD
//以下所有为测试使用...
//应注意,在读I2C芯片时,在发送完I2C片内地址后,
//一定要发送一个重开始信号,然后再发送读命令.
bit WriteI2C(unsigned char Address,unsigned char WriteData)
{&& SENDSTART:
&&& StartI2C();
&&& if(SendChar(I2C_Address)) goto SENDSTART;
&&& SENDADD:
&&& if(SendChar(Address)){StartI2C;goto SENDADD;}
&&& SENDDATA:
&&& if(SendChar(WriteData)){StartI2C;goto SENDDATA;}
&&& if(SendChar(WriteData)){StartI2C;goto SENDDATA;}
&&& StopI2C();
&&& return 0;
unsigned char ReadI2C(unsigned char Address)
{&& unsigned char BackD
&&& ReadSTART:
&&& StartI2C();
&&& if(SendChar(I2C_Address)) goto ReadSTART;
&&& ReadADD:
&&& if(SendChar(Address)){StartI2C;goto ReadADD;}
&&& ReadSTART2:
&&& StartI2C();
&&& if(SendChar(I2C_Address+1)) goto ReadSTART2;
&&& BackData=ReadChar();
&&& ACK();
&&& BackData=ReadChar();
&&& NAK();
&&& StopI2C();
&&& return BackD
void Delay(unsigned int ms)
{&& unsigned int i,j;
&&& for(i=0;i&i++)
&&& for(j=0;j&240;j++);
void main(void)
&&& unsigned char i,BackData=0;
&&& unsigned char Address=0x00,ReadData=0x00;
&&& while(1)
&&& {&& ResetI2C;
&&&&&&& ReadData=ReadI2C(Address);
&&&&&&& ReadData++;
&&&&&&& Delay(5);
&&&&&&& WriteI2C(Address,ReadData);
&&&&&&& Delay(5);
&&&&&&& Address++;Address++;
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:1327人阅读
嵌入式(1)
本文只介绍自己所遇到的问题,具体配置的详细网上有很多不罗嗦,欢迎各位网友讨论自己所遇到的问题
1.若程序停留在while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
& & &则可能的情况是:I2C的初始化没有配置好,可能缺少引脚复用功能的配置
& & GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_I2C2);& //这两个的配置必须有,没有则无法输出
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_I2C2);
经过测试可用的程序如下:
& & && &void i2c_init(void)
& & GPIO_InitTypeDef &gpio_
& & I2C_InitTypeDef &i2c_
& & RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
& & gpio_config.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
gpio_config.GPIO_Mode = GPIO_Mode_AF;
gpio_config.GPIO_Speed = GPIO_Speed_100MHz;
gpio_config.GPIO_OType = GPIO_OType_OD;
gpio_config.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB,&gpio_config);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_I2C2);& //这两个的配置必须有,没有则无法输出
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_I2C2);
i2c_config.I2C_ClockSpeed = 400000;
i2c_config.I2C_Mode = I2C_Mode_I2C;
i2c_config.I2C_DutyCycle = I2C_DutyCycle_2;
i2c_config.I2C_OwnAddress1 = 0x10;& & & //此处地址可以任意设置,当其作为从机的时候,主机对其的寻找地 & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & 址为此地址和0xa0相同
i2c_config.I2C_Ack = I2C_Ack_E
i2c_config.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7
I2C_Init(I2C2,&i2c_config);
& & I2C_Cmd(I2C2,ENABLE);
2.若程序停留在while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
可能的原因是:主函数中的写数据和读数据之间没有加入延时造成的
& & & & & & &如下: I2C_EE_ByteWrite(&data_w, 0x00);
& & & & & & & & & & & & & & &&&delay_s(2);
& & & & & & & & & & & &&I2C_EE_BufferRead(&data_r,0x00, 1);
& & & & 如下的程序为可实现的程序:
writebyte(&data_w,0X00);
delay_s(2);
& & & & //若延迟不加,则接下来的readbyte会有问题
readbyte(&data_r,0x00);
& & printf(& &data is %x &%x &&,data_w,data_r);
& & & & &&
&3.还有可能的问题是I2C的硬件连接有问题如没有将 &SDA和SCL的信号线接上拉电阻。
& & &正确的接法电路图如下图所示:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场i2c_ 简单理解_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
i2c_ 简单理解
上传于|0|0|文档简介
&&新人对i2c接口的理解。
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 i2c read 的文章

 

随机推荐