20

帖子

0

TA的资源

一粒金砂(初级)

61
 
非常感谢百忙之中回答我的问题,我现在先不管从模式,我把6713设为master,这样我应该可以观察到SCL的时钟和SDA数据线上发送的地址吧?但是设好之后,时钟分频率正确,频率范围正确,为什么SCL管脚连时钟信号都没有输出呢?
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

62
 
我问题解决了,是因为DSP下拉电阻坏了,真郁闷呀,本来以为DSP硬件不容易坏,谁知道呢,谢谢你这么长时间的指导
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

63
 
引用:
写道:
我问题解决了,是因为DSP下拉电阻坏了,真郁闷呀,本来以为DSP硬件不容易坏,谁知道呢,谢谢你这么长时间的指导
这么长的讨论,原来是南辕北辙。

 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

64
 

发送数据

你发过来的上次让我下载的程序我下载了,怎么不是工程目录?而且打不开,可否再发一遍到我的邮箱呢?另外你说你试过可以正常发数,是用我的从发送程序吗?我现在也可以发但是发完一个数时钟信号就没有了,我想问问你用我的程序发了几个数?谢谢呀
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

65
 
引用:
 写道:
你发过来的上次让我下载的程序我下载了,怎么不是工程目录?而且打不开,可否再发一遍到我的邮箱呢?另外你说你试过可以正常发数,是用我的从发送程序吗?我现在也可以发但是发完一个数时钟信号就没有了,我想问问你用我的程序发了几个数?谢谢呀
我刚才下载了,并且能够正常打开。
你下载的能正常解压么?
不知道打不开工程提示什么信息。

是在你的接收程序上修改了一下,就能够正常发送了,上面附件就是这个修改后的程序。这个程序只要进入I2C中断,发现是发送就绪中断的话,就发送数据0x55,可以一直连续发送。

 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

66
 
解压缩完就一个文件很奇怪的后缀名,用什么都打不开,奇怪,是不是你从日本发过来被屏蔽了,奇怪,最近怎么老遇到灵异事件,奇怪,摆脱还是邮件给我把,要不换成RAR压缩方式,辛苦了谢谢,就把你改过后能连续发送数据的程序给我,我试一下,谢谢,发了有见告诉我一声
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

67
 
用windowsXP本身就可以解压。
我用的是I2C0,使用前你先改回I2C1。
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

68
 
您好!我现在已经可以正常接收和发送了。我现在想把接收和发送程序合起来,就是先接收master 端传来的数据然后在回传给master端对比以保证通信的可靠性。我的发送和接收使用同一个中断,通过判断中断状态寄存器中的ICXRDY和ICRRDY分别进入发送和接收。现在想明确几个问题

1.发送数据时进入中断服务程序是不是和接收一样一次中断只能发送8bit的一个数据?
2.master发送完数据置1r/w位,slave端进入发送服务开始回传数据。中断服务程序如下所示是不是可以实现我上述要求:
interrupt void  c_int10(void)
{
    if((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_ICRRDY_MASK)!=0)
    {
          ReceiveData[len]=I2C_RGET(I2CDRR0);
          len++;
      
          if(len==4)
          {
                        len=0;
   }
     }
  if((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_ICXRDY_MASK)!=0)
  {
            I2C_RGET(I2CDXR0)=ReceiveData[i++];
  }
}
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

69
 
引用:
写道:
您好!我现在已经可以正常接收和发送了。我现在想把接收和发送程序合起来,就是先接收master 端传来的数据然后在回传给master端对比以保证通信的可靠性。我的发送和接收使用同一个中断,通过判断中断状态寄存器中的ICXRDY和ICRRDY分别进入发送和接收。现在想明确几个问题

1.发送数据时进入中断服务程序是不是和接收一样一次中断只能发送8bit的一个数据?
2.master发送完数据置1r/w位,slave端进入发送服务开始回传数据。中断服务程序如下所示是不是可以实现我上述要求:
interrupt void  c_int10(void)
{
    if((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_ICRRDY_MASK)!=0)
    {
          ReceiveData[len]=I2C_RGET(I2CDRR0);
          len++;
      
          if(len==4)
          {
                        len=0;
   }
     }
  if((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_ICXRDY_MASK)!=0)
  {
            I2C_RGET(I2CDXR0)=ReceiveData[i++];
  }
}
一次只发送一个字节。

上面这个程序是测试用的,回复的数据可能会出问题。

应该在中断中通过I2CISR判断是接收中断还是发送中断。在接收中断接收了最后一个字节的同时,应该写I2CDXR寄存器,下一次master来读数据的时候,就会读取I2CDXR中的值,I2CDXR中的数据发出之后,会向DSP产生中断。这是发送第二个数据。当发送完最后一个数据时,还会来一次发送中断,这时什么都不要做。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

70
 
我这边已经实现了,看了波形也正确,现在想确认一个问题:
在中断服务程序中判断是进入发送还是接收我觉得判断CISR和判断CSTR中的ICXRDY与ICRRDU两位效果是一样的,你觉得呢?
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

71
 
引用:
写道:
我这边已经实现了,看了波形也正确,现在想确认一个问题:
在中断服务程序中判断是进入发送还是接收我觉得判断CISR和判断CSTR中的ICXRDY与ICRRDU两位效果是一样的,你觉得呢?
I2CISR和I2CSTR是不一样的。
I2CISR表明是因为什么产生中断,而I2CSTR只是一个状态寄存器而已,表明发送和接收寄存器是否可以用来发送或接收。

现在发送和接收是没有问题,但是不知道是否能够发送正确的数据。
例如从MCU收到1,2,3,4之后,DSP是否能够将1,2,3,4正确地返回给MCU。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

72
 
master发送的数据可以通过slave接收再正确的发送回去,期间数据传输通过示波器观察是正确的。虽然现在已经成功实现了,但是还有一点不太明白,中断服务程序中在判断进入接收时必须使用if((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_ICRRDY_MASK)!=0);同时判断进入发送时必须使用if(( I2C_RGET(I2CISR0))==0x5),如果接收时改为判断CSTR或者发送时改为CISR都会出现错误。这一点不太理解。
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

73
 
中断服务程序贴出来看看?
另外在中断服务程序之外是否写过一次I2CDXR?

 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(中级)

74
 
在接收完数据后发送一次数据
interrupt void  c_int10(void)
{
   //receive datas from master
    if((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_ICRRDY_MASK)!=0)
    {
          ReceiveData[len]=I2C_RGET(I2CDRR0);
          len++;
      
          if(len==4)
          {
        len=0;
        I2C_RGET(I2CDXR0)=ReceiveData[0];
    }
     }
    //transmit data to Master
  if(( I2C_RGET(I2CISR0))==0x5)
  {
             if(i!=4)
             {
                     I2C_RGET(I2CDXR0)=ReceiveData;
                     i++;
             }
             else
               {
                        i=1;
               }
   }
}
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

75
 
引用:
写道:
在接收完数据后发送一次数据
interrupt void  c_int10(void)
{
   //receive datas from master
    if((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_ICRRDY_MASK)!=0)
    {
          ReceiveData[len]=I2C_RGET(I2CDRR0);
          len++;
      
          if(len==4)
          {
        len=0;
        I2C_RGET(I2CDXR0)=ReceiveData[0];
    }
     }
    //transmit data to Master
  if(( I2C_RGET(I2CISR0))==0x5)
  {
             if(i!=4)
             {
                     I2C_RGET(I2CDXR0)=ReceiveData;
                     i++;
             }
             else
               {
                        i=1;
               }
   }
}
如果要都是用I2CISR0的话,先用一个变量保存其值,再判断。I2CISR0的值一读就会变为零。

event = I2C_RGET(I2CISR0);
if (event == 4) ...
if (event == 5) ...

如果都用I2CSTR0的话,两个if中间需要else. 这样读中断的时候才不会执行写操作。

if((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_ICRRDY_MASK)!=0){

}
else
if(f((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_ICXRDY_MASK)!=0){

}
 
 
 

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

查找数据手册?

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
快速回复 返回顶部 返回列表