17178|16

8

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

我算是服了stm8硬件iic了 [复制链接]

 
大致说说吧,我现在主机软件模拟iic,从机是硬件iic中断

我实现的是主机发命令给从机,从机接收到命令后吧数据发给主机,
而且主机必须让从机休眠,休眠后,必须唤醒。

但是现在通讯都无法正常,

调试了半天,才发现I2C_SR1=0x10

停止位都监测到了,为什么前面地址匹配和数据缓冲非空没有检测到。好奇怪,下断点试了好几遍,现在吧代码贴出来,反正我是服了stm8,好多东西没有avr灵活,我调avr都已经跳成功了,但是stm8不知道怎么回事,好像很高贵的样子。调试了半天,烦了
此帖出自stm32/stm8论坛

最新回复

积分规则:https://bbs.eeworld.com.cn/thread-67200-1-1.html  详情 回复 发表于 2017-7-20 10:25
点赞 关注(2)
 

回复
举报

8

帖子

0

TA的资源

一粒金砂(中级)

来自 3楼
 
  1. /* MAIN.C file
  2. *
  3. * Copyright (c) 2002-2005 STMicroelectronics
  4. */
  5. #include "208io.h"
  6. #include "iic.h"
  7. #include "type.h"


  8. #define N  8
  9. u8 buf[N];
  10. main()
  11. {
  12.        
  13.                 IIC_Init();
  14.                         while (1)
  15.                 {
  16.                                 AT24CXX_WriteOneByte(0x01);
  17.                                 delay_ms(100);       
  18.                         buf[0]=AT24CXX_ReadOneByte();
  19.                                         delay_ms(10);       
  20.                                 AT24CXX_WriteOneByte(0x02);
  21.                                         delay_ms(10);       
  22.                                 buf[1]=AT24CXX_ReadOneByte();
  23.                                                 delay_ms(100);       
  24.                 }

  25. }
复制代码
此帖出自stm32/stm8论坛
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

  1. u8 AT24CXX_ReadOneByte(void)
  2. {                                  
  3.                 u8 temp=0;                                                                                                                                                                  
  4.                 IIC_Start();                     
  5.                 IIC_Send_Byte(0XAB);           //进入接收模式                          
  6.                 IIC_Wait_Ack();         
  7.     temp=IIC_Read_Byte(0);                  
  8.     IIC_Stop();//产生一个停止条件            
  9.                 return temp;
  10. }
  11.   
  12.        
  13. void AT24CXX_WriteOneByte(u8 cmd)
  14. {                                                                                                                                                                                          
  15.     IIC_Start();  
  16.                 IIC_Send_Byte(0XAA);            //发送写命令
  17.                 IIC_Wait_Ack();                                                                       
  18.                 IIC_Send_Byte(cmd);     //发送字节                                                          
  19.                 IIC_Wait_Ack();                                
  20.     IIC_Stop();//产生一个停止条件
  21.                 delay_ms(10);         
  22. }
复制代码



/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include "208io.h"
#include "iic.h"
#include "type.h"


#define N  8
u8 buf[N];
main()
{
       
                IIC_Init();
                        while (1)
                {
                                AT24CXX_WriteOneByte(0x01);
                                delay_ms(100);       
                        buf[0]=AT24CXX_ReadOneByte();
                                        delay_ms(10);       
                                AT24CXX_WriteOneByte(0x02);
                                        delay_ms(10);       
                                buf[1]=AT24CXX_ReadOneByte();
                                                delay_ms(100);       
                }

}
此帖出自stm32/stm8论坛
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

4
 
前面是主机的代码。
  软件模拟的。

下面是从机的代码。主要是初始化部分,和iic中断部分。

  1. /* MAIN.C file
  2. *
  3. * Copyright (c) 2002-2005 STMicroelectronics
  4. */
  5. #include "103io.h"
  6. #include "type.h"

  7. void Gpio_Init(void);
  8. void Iic_Init(void);


  9. u8 temp,temp1,temp2;

  10. void Gpio_Init(void)
  11. {
  12.                 // CLK_CKDIVR = 0x18;
  13.                  PB4_DDR=1;
  14.                  PB5_DDR=1;
  15.                  PB4_CR1=0;
  16.                  PB5_CR1=0;
  17.                 // PB4_ODR=1;
  18.                  //PB5_ODR=1;
  19.                  
  20. }

  21. void Iic_Init(void)
  22. {
  23.                 CLK_PCKENR1 |= 0x01;                                //使能IIC外设时钟
  24.                 I2C_TRISER = 0x02;        //上升沿时间
  25.                 I2C_CR1&=~(1<<0);               
  26.                 I2C_CR1=0x81;                //禁止时钟延展
  27.                
  28.          
  29.                 I2C_CR2 |= (1<<2);//应答使能
  30.                 I2C_FREQR = 0x04;  //外设时钟
  31.                
  32.                 I2C_OARL=0xAA;                //模拟从机地址
  33.                 I2C_OARH=0x40;                //0x01000000//从机地址
  34.                  I2C_CCRH = 0x00;   //标准模式
  35.                 I2C_CCRL = 0x28;  //设置速率是100khz


  36.                 I2C_ITR         |=0x06;//中断使能
  37.                 I2C_CR1|=(1<<0);
  38. }



  39. main()
  40. {
  41.         //        _asm("sim");
  42.                  Gpio_Init();
  43.                 Iic_Init();
  44.                                 I2C_CR1|=(1<<0);
  45.                 _asm("rim");
  46.                 while (1);
  47.                 {
  48.                                
  49.                 }
  50. }

  51. @far @interrupt void iic_irq(void)
  52. {
  53.                 _asm("nop");
  54.                                
  55.                                                 if((I2C_SR1&0x10))                                //停止位侦测
  56.                         {
  57.                          
  58.                                                  temp1=I2C_SR1;
  59.                                                  I2C_CR2|=(1<<1);
  60.                         }
  61.   
  62.                                
  63.                         if((I2C_SR1&(1<<1)))         // 地址匹配
  64.                         {
  65.                                  
  66.                                         temp1=I2C_SR1;
  67.                                         temp2=I2C_SR3;         //地址匹配清除标志位       
  68.                         }       
  69.                         if(I2C_SR1&(1<<6))         //接收到数据
  70.                         {       
  71.                                          
  72.                                
  73.                                         temp=I2C_DR;
  74.                                        
  75.                                         while((I2C_SR1 & 0x80) != 0)                //等待发送寄存器为空
  76.                         {               
  77.                                                 switch(temp)
  78.                                         {
  79.                                                  case 0x01:
  80.                                                  I2C_DR = 0x02;                                                                        //发送要写入的数据
  81.                                                         break;
  82.                                                  case 0x02:
  83.                                                  I2C_DR = 0x04;                                                                        //发送要写入的数据
  84.                                                  break;
  85.                                                  default:
  86.                                                  break;
  87.                                         }                                       
  88.                                         while((I2C_SR1 & 0x04) == 0);                //等待发送完成                 
  89.                                        
  90.                                 }
  91.                         }
  92.        
  93.                                          
  94.                         /*        while((I2C_SR1 & 0x80) != 0)                //等待发送寄存器为空
  95.                         {               
  96.                                                 switch(temp)
  97.                                         {
  98.                                                  case 0x01:
  99.                                                  I2C_DR = 0x02;                                                                        //发送要写入的数据
  100.                                                         break;
  101.                                                  case 0x02:
  102.                                                  I2C_DR = 0x04;                                                                        //发送要写入的数据
  103.                                                  break;
  104.                                                  default:
  105.                                                  break;
  106.                                         }                                       
  107.                                         while((I2C_SR1 & 0x04) == 0);                //等待发送完成                 
  108.                         }                                 */       



  109. }
复制代码
此帖出自stm32/stm8论坛
 
 
 

回复

2002

帖子

24

TA的资源

五彩晶圆(高级)

5
 
加上拉电阻,脚位是真开漏
此帖出自stm32/stm8论坛
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

6
 
stm8s003 的PB4和PB5是真开漏,哎呀,没看手册啊!
此帖出自stm32/stm8论坛
 
 
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

7
 
解決了麼??加上拉電阻效果怎麼樣
此帖出自stm32/stm8论坛

点评

楼主不靠谱,怎么不会来结贴!  详情 回复 发表于 2014-12-10 15:30
 
 
 

回复

301

帖子

2

TA的资源

一粒金砂(中级)

8
 
常见泽1 发表于 2014-5-5 16:56
解決了麼??加上拉電阻效果怎麼樣
楼主不靠谱,怎么不会来结贴!
此帖出自stm32/stm8论坛
 
 
 

回复

1万

帖子

25

TA的资源

裸片初长成(高级)

9
 
看来,芯片有什么问题不是容易发现的。

别人出一个片子,不知道测试了多少遍,根本不会出现低级问题的。

编程序,还是多找找自己的失误
此帖出自stm32/stm8论坛
 
 
 

回复

1560

帖子

24

TA的资源

五彩晶圆(初级)

10
 
本帖最后由 lonerzf 于 2014-12-10 21:07 编辑

看来楼主已经顺利解决了。其实可以看看人家的demo,一般IIC这些都有写好的。
此帖出自stm32/stm8论坛
 
个人签名这孩子,成熟的象征,理智的典范。
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

11
 
请问楼主有没有调成的代码?同是主模拟  从硬件   
调试有问题   求代码参考下
此帖出自stm32/stm8论坛
 
 
 

回复

229

帖子

0

TA的资源

纯净的硅(高级)

12
 
我用STM32的时候做EEPROM软件读写也出现过这个问题:
波形,从件应答都很好,就是写不进数据。
后来把IO切换方向的程序代码顺序改下就好了。
软件IIC,SDA会要切换I/O模式,在切换之前,把SCL置低。
仅供参考。
此帖出自stm32/stm8论坛
 
个人签名作人随心、做事随缘。世间凡事岂能尽如人意。不求无怨无悔、但求无愧于心。
 
 

回复

2

帖子

2

TA的资源

一粒金砂(初级)

13
 
开漏怎么影响到这个的?
此帖出自stm32/stm8论坛
 
 
 

回复

15

帖子

5

TA的资源

一粒金砂(初级)

14
 
请版主,说明如何解决的。多谢了!
此帖出自stm32/stm8论坛

点评

将STM8的iic引脚配置成开漏,再有注意2个时序一定要吻合,最好跑cos系统,将通讯优先级设定最高! 保证不能被中断打断!因为IIC是有规定,时序最大值和最小值都是有要求的,我这个贴也有3年时间了,想想,希望帮  详情 回复 发表于 2017-9-28 16:45
 
 
 

回复

15

帖子

5

TA的资源

一粒金砂(初级)

15
 
回帖没有积分奖励吗????
此帖出自stm32/stm8论坛

点评

积分规则:https://bbs.eeworld.com.cn/thread-67200-1-1.html  详情 回复 发表于 2017-7-20 10:25
 
 
 

回复

2万

帖子

74

TA的资源

管理员

16
 
5000322 发表于 2017-7-20 09:49
回帖没有积分奖励吗????

积分规则:https://bbs.eeworld.com.cn/thread-67200-1-1.html
此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

17
 
5000322 发表于 2017-7-20 09:49
请版主,说明如何解决的。多谢了!

将STM8的iic引脚配置成开漏,再有注意2个时序一定要吻合,最好跑cos系统,将通讯优先级设定最高!

保证不能被中断打断!因为IIC是有规定,时序最大值和最小值都是有要求的,我这个贴也有3年时间了,想想,希望帮到更多人吧!
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表