OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7893|回复: 5

关于I2C_ Send7bitAddress库函数的疑惑

[复制链接]

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2014-8-23
在线时间
2 小时
发表于 2014-8-27 02:06:18 | 显示全部楼层 |阅读模式
5金钱
库函数:I2C_ Send7bitAddress,STM32作为主器件向从器件发送地址数据,可是他只有7位。而我用的外设模块是8位的,那么我的模块不就不好用了吗?

模块的高两位产生三种指令
B7位  丨     B6位     丨         指令                                           
0       丨      1         丨     数据命令设置                       
1       丨      0         丨    显示控制命令设置                         **每种指令的后六位对应不通的功能**
1       丨      1         丨    地址命令设置


另外有看到:1、I2C_ SendData通过外设I2C模块发送数据:
对应I2C_DR寄存器,DR[7:0]:8位数据寄存器 (8-bit data register)位[7:0];功能:(用于存放接收到的数据或)放置用于发送到总线的数据。
                  
                   2、 I2C_ Send7bitAddress:发送的模式
                   是把地址   I2C_Addr & 0xfffe   的值送到DR里面
假设我  I2C_Addr=0x40       那么I2C_Addr & 0xfffe = 0x40 —>DR    推论:其实发送的地址还是8位的。
                   
                  ****问题,如果是这样为什么还要用     I2C_ Send7bitAddress    函数呢,而不直接用    I2C_ SendData。



下面是一段代码,标注了位置①和位置②                 
[mw_shl_code=c,true]uint8_t I2C_WriteOneByte(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint8_t addr,uint8_t value) { I2C_GenerateSTART(I2Cx, ENABLE); //产生起始信号 while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)); //判断相应的事件有没有产生 #ifdef AT24C01A I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter); //↑↑ 传送一个地址字节数据 // **位置①** while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2Cx, addr); // **位置②** while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); #else [/mw_shl_code]

这两个位置   不应该应该是收到应答信号,然后ADDR位被置1,接受完成接下来才是判断相应的事件才能 “ture” 吗?

希望高手指点,谢谢!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

124

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-8-12
在线时间
0 小时
发表于 2014-8-27 03:39:10 | 显示全部楼层
兄台你犀利了,这个时间点还在发表主题,犀利啊,我都想睡觉了
当你想到自己还一无所有的时候,请记得你还有梦想!
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-8-27 08:59:32 | 显示全部楼层
你总线上的设备是非标的I2C?
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2014-8-23
在线时间
2 小时
 楼主| 发表于 2014-8-27 10:48:56 | 显示全部楼层
回复【2楼】挑战者:
---------------------------------
你这个点,我已经在做梦啦。
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2014-8-23
在线时间
2 小时
 楼主| 发表于 2014-8-27 10:55:05 | 显示全部楼层
回复【3楼】styleno1:
---------------------------------
是啊,TM1637芯片。     是不是非标不用按照AT24C02.C里写的程序那样操作,可以稍作修改,

比如不用I2C_ Send7bitAddress    函数,都用    I2C_ SendData   函数呢?
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2014-8-23
在线时间
2 小时
 楼主| 发表于 2014-12-6 18:37:04 | 显示全部楼层
[mw_shl_code=c,true]#include "myiic.h" #include "delay.h" #include "LCD.h" //??????IIC void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; //?á?????????? RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE ); //?á???????????? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //???ì???? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); IIC_SCL=1; IIC_SDA=1; } //?ú?úIIC???????? ?????????????±???????????????????????????????????­?????±3 void IIC_Start(void) { SDA_OUT(); IIC_SCL=1; IIC_SDA=1; Delay_us(3); IIC_SDA=0; Delay_us(3); IIC_SCL=0; Delay_us(3); } //?ú?úIIC???????? ???????????????????????????????????±?????????????????????????±?????­?????±?ó???????­?? void IIC_Stop(void) { SDA_OUT();//sda?????? // IIC_SCL=0; // Delay_us(3); IIC_SDA=0; Delay_us(3); IIC_SCL=1; Delay_us(3); IIC_SDA=1; } //???????????????? //·???????1???????????§°? // 0?????????????? u8 IIC_Wait_Ack(void) { u8 ucErrTime=0; SDA_IN(); //??????SDA?è???????? IIC_SDA=1; Delay_us(3); //?­???±???????????????????÷??°??±?????­?????¨???????????????????±?????????????© IIC_SCL=1; Delay_us(3); while(READ_SDA) { ucErrTime++; if(ucErrTime>250) { IIC_Stop(); return 1; } } IIC_SCL=0;//?±??????0 return 0; } //?ú?úACK???? void IIC_Ack(void) { // IIC_SCL=0; SDA_OUT(); //???????è???????????????????????????????????±????????±?????±??? // IIC_SDA=0; // Delay_us(3); // IIC_SCL=1; // Delay_us(3); // IIC_SCL=0; IIC_SDA=0; Delay_us(3); IIC_SCL=1; Delay_us(3); IIC_SCL=0; Delay_us(3); IIC_SDA=1; Delay_us(3); } //???ú?úACK???? void IIC_NAck(void) { // IIC_SCL=0; SDA_OUT(); IIC_SDA=1; Delay_us(3); IIC_SCL=1; Delay_us(3); IIC_SCL=0; Delay_us(3); //???????????­?? ???ú?ú???? } //IIC·???????×??? //·??????ú???????? //1???????? //0???????? void IIC_Write_Byte(unsigned char txd) //??????×????? { u8 t; for(t=0;t<8;t++) { SDA_OUT(); //IIC_SCL=0; //IIC_SDA=(txd&0x80)>>7; if(txd&0x80) //txd??????????????????0x80????????????10000000 {IIC_SDA=1;} //?±???¨txd&0x80?©=1?±???÷??????????????±?????1 else {IIC_SDA=0;} //·??ò??0 Delay_us(3); txd=txd<<1; //??????????????±????????? IIC_SCL=1; Delay_us(3); IIC_SCL=0; if(t==7) {IIC_SDA=1;} Delay_us(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++ ) { SDA_IN(); //??????SDA?????? // IIC_SCL=0; // Delay_us(3); IIC_SCL=1; receive=receive<<1;//???­3?????? ??????????????????·??????? if(READ_SDA) //???­1????????????·???1 receive++; //???­2??????1 ?òreceive????1 ???±?ü?? ??????0000??0001 Delay_us(3); IIC_SCL=0; Delay_us(3); } if (!ack) IIC_NAck();//·???nACK else IIC_Ack(); //·???ACK return receive; } [/mw_shl_code]

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 04:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表