OpenEdv-开源电子网

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

尝试发送I2C信号,但是SCL在数据期间,一直维持低电平

[复制链接]

33

主题

114

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2019-7-8
在线时间
177 小时
发表于 2020-1-10 11:59:18 | 显示全部楼层 |阅读模式
30金钱
这是我用逻辑分析仪抓出的信号
1.png

除了开始信号的下降沿,还有结束信号的上升沿,剩下数据传输部分的SCL,完全都是低电平
我不知道代码哪里有问题了,另外,SDA和SCL需要上拉或下拉电阻吗?
  1. #include "iic.h"
  2. #include "delay.h"

  3. /* =================================================================== */
  4. /* IIC2初始化函数(CH455:数码管+按钮管控IC) */
  5. /* =================================================================== */
  6. void IIC2_Init(void)
  7. {                       
  8.   GPIO_InitTypeDef  GPIO_InitStructure;

  9.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟

  10.         //PB10:I2C2_SCL
  11.         //PB11:I2C2_SDA
  12.         //PB12:I2C2_SMBA
  13.   //PB10,PB11初始化设置
  14.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
  15.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  16.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  17.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
  18.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  19.   GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
  20.        
  21.         //GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);
  22.         IIC_SCL=1;
  23.         IIC_SDA=1;  
  24.          
  25.         //CH455_Write( CH455_SYSON_8 );                //八段式
  26. }


  27. /* =================================================================== */
  28. /* IIC产生起始信号*/
  29. /* =================================================================== */
  30. void IIC_Start(void)
  31. {
  32.         SDA_OUT();     //sda线输出
  33.         IIC_SDA=1;                    
  34.         IIC_SCL=1;
  35.         delay_us(4);
  36.         IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  37.         delay_us(4);
  38.         IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
  39. }       


  40. /* =================================================================== */
  41. /* IIC产生停止信号 */
  42. /* =================================================================== */
  43. void IIC_Stop(void)
  44. {
  45.         SDA_OUT();//sda设置为输出
  46.         IIC_SCL=0;
  47.         IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  48.         delay_us(4);
  49.         IIC_SCL=1;
  50.         IIC_SDA=1;//发送I2C总线结束信号
  51.         delay_us(4);               
  52. }


  53. /* =================================================================== */
  54. /* 写一个字节数据 */
  55. /* =================================================================== */
  56. void CH455_I2c_WrByte(u8 dat)
  57. {
  58.         u8 i;
  59.         SDA_OUT();   /* 设置SDA为输出方向 */
  60.         for( i = 0; i != 8; i++ )  // 输出8位数据
  61.         {
  62.                 if( dat & 0x80 )
  63.                 {
  64.                     CH455_SDA_SET;
  65.                 }
  66.                 else
  67.                 {
  68.                     CH455_SDA_CLR;
  69.                 }
  70.                 delay_us(4);
  71.                 CH455_SCL_SET;
  72.                 dat <<= 1;
  73.                 delay_us(4);  // 可选延时
  74.                 CH455_SCL_CLR;
  75.         }
  76.         SDA_IN();   /* 设置SDA为输入方向 */
  77.         CH455_SDA_SET;
  78.         delay_us(4);
  79.         CH455_SCL_SET;  // 接收应答
  80.         delay_us(4);
  81.         CH455_SCL_CLR;
  82. }


  83. /* =================================================================== */
  84. /* 读一个字节数据 */
  85. /* =================================================================== */
  86. u8 CH455_I2c_RdByte(void)
  87. {
  88.         u8 dat,i;
  89.         CH455_SDA_SET;
  90.         SDA_IN();   /* 设置SDA为输入方向 */
  91.         dat = 0;
  92.         for( i = 0; i != 8; i++ )  // 输入8位数据
  93.         {
  94.                 delay_us(4);  // 可选延时
  95.                 CH455_SCL_SET;
  96.                 delay_us(4);  // 可选延时
  97.                 dat <<= 1;
  98.                 if( CH455_SDA_IN ) dat++;  // 输入1位
  99.                 CH455_SCL_CLR;
  100.         }
  101.         CH455_SDA_SET;
  102.         delay_us(4);
  103.         CH455_SCL_SET;  // 发出无效应答
  104.         delay_us(4);
  105.         CH455_SCL_CLR;
  106.         return dat;
  107. }


  108. /* =================================================================== */
  109. /* 写命令 */
  110. /* =================================================================== */
  111. void CH455_Write(u16 cmd)
  112. {
  113.         IIC_Start();               //启动总线
  114.            CH455_I2c_WrByte(((u8)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR);
  115.            CH455_I2c_WrByte((u8)cmd);               //发送数据
  116.           IIC_Stop();                 //结束总线
  117. }


  118. /* =================================================================== */
  119. /* 读取按键 */
  120. /* =================================================================== */
  121. u8 CH455_Read(void)
  122. {
  123.         u8 keycode;
  124.            IIC_Start();                //启动总线
  125.            CH455_I2c_WrByte((u8)(CH455_GET_KEY>>7)&CH455_I2C_MASK|0x01|CH455_I2C_ADDR);
  126.            keycode=CH455_I2c_RdByte();      //读取数据
  127.         IIC_Stop();                //结束总线
  128.         return keycode;
  129. }


  130. 在main里面,只有调用下面两个代码
复制代码


希望能给我一些思路和指正,谢谢了

最佳答案

查看完整内容[请看2#楼]

找到原因了,I2C我是想用在数码管驱动IC上的,我一部分参考正点原子的代码,另一部分参考CH455官方的代码,然后更重要的一点是,我才发现,I2C初始化都没有映射到指定的引脚,尝试添加后无果,在论坛查阅的大量资料,发现这个I2C是模拟的。。。这一路走来真是曲折,总结就是,不要混着用,然后尽量读懂正点原子的代码在做什么事情,最后是复制也要注意,也许漏掉了哪部分重要代码都不知道
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

114

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2019-7-8
在线时间
177 小时
 楼主| 发表于 2020-1-10 11:59:19 | 显示全部楼层
找到原因了,I2C我是想用在数码管驱动IC上的,我一部分参考正点原子的代码,另一部分参考CH455官方的代码,然后更重要的一点是,我才发现,I2C初始化都没有映射到指定的引脚,尝试添加后无果,在论坛查阅的大量资料,发现这个I2C是模拟的。。。这一路走来真是曲折,总结就是,不要混着用,然后尽量读懂正点原子的代码在做什么事情,最后是复制也要注意,也许漏掉了哪部分重要代码都不知道
回复

使用道具 举报

33

主题

114

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2019-7-8
在线时间
177 小时
 楼主| 发表于 2020-1-10 12:03:00 | 显示全部楼层
代码块最后的两行代码怎么被吃掉了? 6.png
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-11 16:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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