OpenEdv-开源电子网

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

模拟IIC管脚电压低

[复制链接]

31

主题

176

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2015-10-16
在线时间
85 小时
发表于 2018-4-4 15:47:02 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 ziyan0005 于 2018-4-4 17:08 编辑

用STM32F103C8T6两个能容忍5V的管脚做IIC,10k上拉5V,做了一批板子,现在发现一个板子的SCL达不到4.5V,SDA能达到5V,请问什么问题?
SCL偶尔能到5V,大部分时间量都达不到4.5V,会是芯片管脚的问题吗?坏了??

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

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-4-4 16:02:03 | 显示全部楼层
回复

使用道具 举报

31

主题

176

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2015-10-16
在线时间
85 小时
 楼主| 发表于 2018-4-4 16:38:07 | 显示全部楼层

SCL和SDA都是10k上拉
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2018-4-4 16:44:49 | 显示全部楼层
上拉电阻接小点 1.5K,2.2K,4.7K 选一种试试
回复

使用道具 举报

31

主题

176

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2015-10-16
在线时间
85 小时
 楼主| 发表于 2018-4-4 16:51:51 | 显示全部楼层
wxjhby 发表于 2018-4-4 16:44
上拉电阻接小点 1.5K,2.2K,4.7K 选一种试试

那SDA能达到5V就不用换了呗?为什么同样的两个脚,同样的电阻值,电压就不一样了呢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-4-5 01:26:23 | 显示全部楼层
ziyan0005 发表于 2018-4-4 16:51
那SDA能达到5V就不用换了呗?为什么同样的两个脚,同样的电阻值,电压就不一样了呢

看能不能通信,这是关键
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-4-8 09:06:39 | 显示全部楼层
ziyan0005 发表于 2018-4-4 16:38
SCL和SDA都是10k上拉

管脚配置 看下
回复

使用道具 举报

31

主题

176

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2015-10-16
在线时间
85 小时
 楼主| 发表于 2018-4-13 09:19:17 | 显示全部楼层
正点原子 发表于 2018-4-5 01:26
看能不能通信,这是关键

能通信,可以正常用,就是电压低些
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-4-16 02:08:06 | 显示全部楼层
ziyan0005 发表于 2018-4-13 09:19
能通信,可以正常用,就是电压低些

设置开漏输出试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

31

主题

176

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2015-10-16
在线时间
85 小时
 楼主| 发表于 2018-5-3 15:36:49 | 显示全部楼层

原子哥,IIC两个管脚是这样的
// I2C IO-Pins
// SDA on port B, bit 6
#define SDA1_LOW()  (GPIOB->BSRR = 0x00400000) // set SDA to low
#define SDA1_OPEN() (GPIOB->BSRR = 0x00000040) // set SDA to open-drain
#define SDA1_READ   (GPIOB->IDR  & 0x0040)     // read SDA

// SCL on port B, bit 7
#define SCL1_LOW()  (GPIOB->BSRR = 0x00800000) // set SCL to low
#define SCL1_OPEN() (GPIOB->BSRR = 0x00000080) // set SCL to open-drain
#define SCL1_READ   (GPIOB->IDR  & 0x0080)     // read SCL

etError I2c1_WriteByte(uint8 txByte)
{
  etError error = NO_ERROR;
  uint8     mask;
  for(mask = 0x80; mask > 0; mask >>= 1)// shift bit for masking (8 times)
  {
    if((mask & txByte) == 0) SDA1_LOW(); // masking txByte, write bit to SDA-Line
    else                     SDA1_OPEN();
    DelayMicroSeconds(1);               // data set-up time (t_SU;DAT)
    SCL1_OPEN();                         // generate clock pulse on SCL
    DelayMicroSeconds(5);               // SCL high time (t_HIGH)
    SCL1_LOW();
    DelayMicroSeconds(1);               // data hold time(t_HD;DAT)
  }
        SDA1_OPEN();                           // release SDA-line
  SCL1_OPEN();                           // clk #9 for ack
  
  DelayMicroSeconds(5);                 // data set-up time (t_SU;DAT)
  if(SDA1_READ) error = ACK_ERROR;       // check ack from i2c slave
  SCL1_LOW();
  DelayMicroSeconds(20);                // wait to see byte package on scope
  return error;                         // return error code
}

//------------------------------------------------------------------------
uint8 I2c1_ReadByte(etI2cAck ack)
{
  uint8 mask;
  uint8 rxByte = NO_ERROR;
        SDA1_OPEN();                            // release SDA-line
  for(mask = 0x80; mask > 0; mask >>= 1) // shift bit for masking (8 times)
  {
    SCL1_OPEN();                          // start clock on SCL-line
    DelayMicroSeconds(3);                // SCL high time (t_HIGH)
    if(SDA1_READ) rxByte = rxByte | mask;        // read bit
    SCL1_LOW();
    DelayMicroSeconds(1);                // data hold time(t_HD;DAT)
  }  
  if(ack == ACK) SDA1_LOW();              // send acknowledge if necessary
  else           SDA1_OPEN();
       
  DelayMicroSeconds(1);                  // data set-up time (t_SU;DAT)
  SCL1_OPEN();                            // clk #9 for ack
  DelayMicroSeconds(5);                  // SCL high time (t_HIGH)
  SCL1_LOW();
        SDA1_OPEN();                            // release SDA-line
  DelayMicroSeconds(20);                 // wait to see byte package on scope
  
  return rxByte;                          // return with no error
}

麻烦帮我看看,有错误吗?我今天遇到一个板子,这两个脚都是1V,我电路上上拉到5V


回复

使用道具 举报

31

主题

176

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2015-10-16
在线时间
85 小时
 楼主| 发表于 2018-5-3 15:40:23 | 显示全部楼层

IIC两个管脚是这样的
// I2C IO-Pins
// SDA on port B, bit 6
#define SDA1_LOW()  (GPIOB->BSRR = 0x00400000) // set SDA to low
#define SDA1_OPEN() (GPIOB->BSRR = 0x00000040) // set SDA to open-drain
#define SDA1_READ   (GPIOB->IDR  & 0x0040)     // read SDA

// SCL on port B, bit 7
#define SCL1_LOW()  (GPIOB->BSRR = 0x00800000) // set SCL to low
#define SCL1_OPEN() (GPIOB->BSRR = 0x00000080) // set SCL to open-drain
#define SCL1_READ   (GPIOB->IDR  & 0x0080)     // read SCL

etError I2c1_WriteByte(uint8 txByte)
{
  etError error = NO_ERROR;
  uint8     mask;
  for(mask = 0x80; mask > 0; mask >>= 1)// shift bit for masking (8 times)
  {
    if((mask & txByte) == 0) SDA1_LOW(); // masking txByte, write bit to SDA-Line
    else                     SDA1_OPEN();
    DelayMicroSeconds(1);               // data set-up time (t_SU;DAT)
    SCL1_OPEN();                         // generate clock pulse on SCL
    DelayMicroSeconds(5);               // SCL high time (t_HIGH)
    SCL1_LOW();
    DelayMicroSeconds(1);               // data hold time(t_HD;DAT)
  }
        SDA1_OPEN();                           // release SDA-line
  SCL1_OPEN();                           // clk #9 for ack
  
  DelayMicroSeconds(5);                 // data set-up time (t_SU;DAT)
  if(SDA1_READ) error = ACK_ERROR;       // check ack from i2c slave
  SCL1_LOW();
  DelayMicroSeconds(20);                // wait to see byte package on scope
  return error;                         // return error code
}

//------------------------------------------------------------------------
uint8 I2c1_ReadByte(etI2cAck ack)
{
  uint8 mask;
  uint8 rxByte = NO_ERROR;
        SDA1_OPEN();                            // release SDA-line
  for(mask = 0x80; mask > 0; mask >>= 1) // shift bit for masking (8 times)
  {
    SCL1_OPEN();                          // start clock on SCL-line
    DelayMicroSeconds(3);                // SCL high time (t_HIGH)
    if(SDA1_READ) rxByte = rxByte | mask;        // read bit
    SCL1_LOW();
    DelayMicroSeconds(1);                // data hold time(t_HD;DAT)
  }  
  if(ack == ACK) SDA1_LOW();              // send acknowledge if necessary
  else           SDA1_OPEN();
        
  DelayMicroSeconds(1);                  // data set-up time (t_SU;DAT)
  SCL1_OPEN();                            // clk #9 for ack
  DelayMicroSeconds(5);                  // SCL high time (t_HIGH)
  SCL1_LOW();
        SDA1_OPEN();                            // release SDA-line
  DelayMicroSeconds(20);                 // wait to see byte package on scope
  
  return rxByte;                          // return with no error
}

麻烦帮我看看,有错误吗?我今天遇到一个板子,这两个脚都是1V,我电路上上拉到5V
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-5-4 11:38:40 | 显示全部楼层
本帖最后由 xyl210xyl 于 2018-5-4 11:42 编辑

SCL 和SDA 的配置输出方式肯定不同,你配成一样了
回复

使用道具 举报

31

主题

176

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2015-10-16
在线时间
85 小时
 楼主| 发表于 2018-5-18 10:53:28 | 显示全部楼层
xyl210xyl 发表于 2018-5-4 11:38
SCL 和SDA 的配置输出方式肯定不同,你配成一样了

输出不是开漏和拉低切换嘛,哪个位置一样?
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-5-18 16:14:16 | 显示全部楼层
ziyan0005 发表于 2018-5-18 10:53
输出不是开漏和拉低切换嘛,哪个位置一样?

i2c,数据IO,都是同一根,拉低的时候能收到消息么
回复

使用道具 举报

31

主题

176

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2015-10-16
在线时间
85 小时
 楼主| 发表于 2018-5-18 16:46:29 | 显示全部楼层
xyl210xyl 发表于 2018-5-18 16:14
i2c,数据IO,都是同一根,拉低的时候能收到消息么

不是同一根啊
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-5-18 17:32:23 | 显示全部楼层

如果,你觉得i2c 数据线不是同一根的话。。。我表示帮不了你
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 01:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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