24560|74

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

6713 i2C [复制链接]

大家好,我现使用6713通过I2c0口读取单片机传来的数据,工作在从模式,看了相关例程都没有使用到中断,我想知道数据传输过程到底要不要使用中断,请大家指导一下吧,如果需要请给我贴一个例程上来,谢谢

最新回复

引用:写道: 在接收完数据后发送一次数据 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){ }  详情 回复 发表于 2007-7-21 08:05
 
点赞 关注

回复
举报

85

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
最好使用中断。
好好阅读6713I2C的文档,设置不难。
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

我就是在用它的中断的时候有些问题

可否给我讲解一下,或者给我贴一些中断部分的代码?不胜感激
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
我是用dsp/bios设置的HWI.
我选择的HWI_INT13,设置其interrupt source 为 I2C_Interrupt_0
function 为 _I2C_isr
Use Dispatcher为True
然后写函数I2C_isr
在其中用I2C_rrdy, I2C_xrdy判断输入输出是否准备就绪
如果就绪就用I2C_writeByte和I2C_readByte写或者读数据。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

5
 

谢谢

我现在用查询的方式实现了,准备改成中断,可否给我你的qq或MSN,如果有问题想问你一下
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

6
 
没有太明白你问的是什么。

I2C有两个寄存器,你看看你问的是不是有关它们的。
I2C interrupt Enable Register (I2CIER)
I2C interrupt Source Register (I2CISR)

另外我前面说过,我用的是DSP/BIOS设置的I2C中断。
没有试过IRQ_map,你可以试试看,你那样设置之后
是否能接收到I2C的中断。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 

问问

我做了6713一段时间,INT0-15各中断理解不透,我不知道何时中断会发生进入中断服务程序,比如IIRQ_EVT_I2CINT1,事件I2CINT1何时发生,是收到数后就进入中断吗?那也就是有外部引脚状态确定了的?
 
 
 

回复

95

帖子

0

TA的资源

一粒金砂(初级)

8
 
建议阅读
http://focus.ti.com/lit/ds/symlink/tms320c6713.pdf的interrupts and interrupt selector章节

具体地说,
I2C可以产生几种中断,究竟哪些I2C中断会被传给DSP,就需要设置寄存器:I2C interrupt Enable Register (I2CIER)

67x的DSP内核支持16个中断,中断4-15的中断源是可以修改的,你不修改它们,它们也有一个缺省的中断源。但是没有一个缺省是I2C的中断,所以你必须把某个中断的中断源设为I2C1。假设你设置了中断13的中断源为I2C1,那么I2C1若产生中断的话,DSP就要响应中断13。在中断13中你的程序再根据I2C interrupt Source Register (I2CISR)判断,到底是I2C的哪种中断产生了。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 

??

嗯,上面说的都明白,但是寄存器I2CIER在程序中的I2c相关头文件里只有I2CIMR,应该是一样的吧,问题是我自己不用手动配置I2CIER吧?是不是只要使能了相关的位,比如说我使能了ICRRDY,代码如下:
I2C_RSET(I2CIMR1,I2C_I2CIMR_RMK(I2C_I2CIMR_ICXRDY_MSK,
I2C_I2CIMR_ICRRDY_UNMSK,
I2C_I2CIMR_ARDY_MSK,
I2C_I2CIMR_NACK_MSK,
I2C_I2CIMR_AL_MSK));
那么一旦I2c检测到数据就会产生ICRRDY中断是吗?然后我的中断服务程序写为:
interrupt void  c_int14(void)
{
while(len>0)
  {
    if((I2C_RGET(I2CSTR1)&_I2C_I2CSTR_ICRRDY_MASK)!=0)
       {
          ReceiveData[len-4]=I2C_RGET(I2CDRR1);
          len--;
          //I2C_FSETH(hI2C,I2CSTR,ICRRDY,0);
       }
  }
  while((I2C_RGET(I2CSTR1)&_I2C_I2CSTR_BB_MASK)!=0);   // 等着变为空闲
}
不知道是否正确?
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

10
 
好像你理解有误。
如果I2CIER只enable了ICRRDY的话,那么ICRRDY中断服务里面,就直接读取一个数据就行了。下一个数据要下一次中断时读取。一次中断读取一个数据,并不是在中断里面做循环。

interrupt void  c_int14(void)
{

    if((I2C_RGET(I2CSTR1)&_I2C_I2CSTR_ICRRDY_MASK)!=0)
       {
          ReceiveData[len-4]=I2C_RGET(I2CDRR1);
          len--;
          if(len<4){
             your code....
          }
       }
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

11
 

??

那你的意思是说一次中断只能读取1次一个字节的数?我现在接收MCU发来的数据,它一次向I2c总线发送32bit4个8bit的数字,我要把这四个数存在Recievedata数组里一次提供给别的应用程序用,按你的意思我不是一次中断接收完所有数?只能等4次中断?那中断服务程序改为下面的情况对否?
len=4
interrupt void  c_int14(void)
{
    if((I2C_RGET(I2CSTR1)&_I2C_I2CSTR_ICRRDY_MASK)!=0)
       {
          ReceiveData[len-4]=I2C_RGET(I2CDRR1);
          len--;
          if(len==0)
          {
              置位相应存储满标志位,通知应用程序从ReceiveData取数
    len=4;//重新给ReceiveData赋值
          }
   while((I2C_RGET(I2CSTR1)&_I2C_I2CSTR_BB_MASK)!=0);   // 等着变为空闲
          //I2C_FSETH(hI2C,I2CSTR,ICRRDY,0);
       }
  }

另外I2C涉及到总共三个寄存器
I2CIER中断使能寄存器
I2CSTR中断状态寄存器
I2CISR中断源寄存器

我想问一下我要想使用中断接收数据是不是只需要手动代码配置I2CIER中断使能寄存器就行了,其余两个不用配置吧?
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

12
 
4个字节就是4次中断。这样做可以比用while节省DSP时间。当然为了更加节省,可以通过DMA读取I2C,这样就是4个字节产生一个DMA中断了,不过这样做设置起来比较复杂。

不明白程序中的len-4
ReceiveData[len-4]=I2C_RGET(I2CDRR1);
你要用-1,-2这样的下标么?

也不明白为什么
while((I2C_RGET(I2CSTR1)&_I2C_I2CSTR_BB_MASK)!=0);   // 等着变为空闲
这个while应该可以不要。

如你所说,只需要设置
I2CIER中断使能寄存器
即可。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

13
 
我觉得在4-len上,你是想多了。
用--的话,每次程序需要做4-len和len--两件事情。
用++的话,由于可以直接使用len,不需要做4-len计算,而len++不会比len--慢。
慢可能会出现在if的判断上,即使len==0比len==4快,也最多把4-len的计算给赢回来。

何况6713做这点事情根本不费时的,所以。。。

我的I2C中断中没有等着变为空闲的程序,运行没有出现问题,所以我觉得这句程序可以不要。
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

14
 
非常感谢,学了很多,再次谢谢呀!
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

15
 

新的问题

你好,我在使用I2C接收数据时多次resetCCS再restart有时候会出现接收错的情况,此时关掉电源,再重启CCS收数又会恢复正常,请问是什么原因呢?我是使用仿真器进行EMULATOR操作。

另外我想问一下,当程序中有多个中断,同时对应多个中断服务程序是不是各自产生中断,互不干扰呢?另外要使用哪个中断,需要在ASM文件中添加此句.ref _c_int08,为什么我没有添加这句话仍然会进入中断服务程序interrupt void  c_int08(void)呢?
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

16
 
reset, restart之后,出现的错误具体是指什么。我想出现错误的原因有很多,必须具体问题具体分析。

一般中断服务程序执行过程中,无法响应其它的中断,若此时产生了其它的中断。必须等当前的中断服务程序执行结束之后,才会去执行其它的中断服务程序。因此若你的中断服务程序执行时间过长的话,会影响到其它的中断的正常响应。因此推荐使用DSP/BIOS的HWI。

至于.ref _c_int08问题,不太明白你指的是什么。这个我想必须看到你的程序才能搞清楚。
 
 
 

回复

99

帖子

0

TA的资源

一粒金砂(中级)

17
 
reset再restart后出现的是I1C收到的数据有误,重启CCS后没有问题

关于c_int08,我的EDMA对应中断c_int08,配置好中断后,是不是应该在在*asm文件中加上代码.ref _c_int08才能够正常进入c_int08中断?

关于DSP/BIOS的HWI可否给我一份参考文档,a7662156@tom.com
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

18
 
接收的数据有怎样的错误?再具体一些
能进你的中断函数 c_int08,说明中断向量表的相应位置设置正确,即能正确地跳转到c_int08,不知你是如何设置中断向量表的。
关于DSP/BIOS的文档,请参照TI的         TMS320 DSP/BIOS User\'s Guide

 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

19
 
就是说接收到的数据用watch window观察有错误,数值不符,事先传输的数字我是知道的,多次reset后再接收就会发现收到的数字结果不正确。

以下是我的asm文件内容,我不理解的是为什么之前在此文件中我没有   .ref _c_int08这句仍能够正常进入c_int08中断?:

*------------------------------------------------------------------------------
* Global symbols defined here and exported out of this file
*------------------------------------------------------------------------------
   .global _vectors
   .global _c_int00
   .global _vector1
   .global _vector2
   .global _vector3
   .global _vector4
   .global _vector5
   .global _vector6
   .global _vector7
   .global _c_int08  ; Hookup the c_int08 ISR in main()
   .global _vector9          
   .global _vector10
   .global _vector11
   .global _vector12   
   .global _vector13   
   .global _vector14   
   .global _vector15   


   .ref _c_int00
   .ref _c_int08

*------------------------------------------------------------------------------
* This is a macro that instantiates one entry in the interrupt service table.
*------------------------------------------------------------------------------
VEC_ENTRY .macro addr
    STW   B0,*--B15
    MVKL  addr,B0
    MVKH  addr,B0
    B     B0
    LDW   *B15++,B0
    NOP   2
    NOP   
    NOP   
   .endm


*------------------------------------------------------------------------------
* This is a dummy interrupt service routine used to initialize the IST.
*------------------------------------------------------------------------------
_vec_dummy:
  B    B3
  NOP  5


.sect \".text:vecs\"
.align 1024

_vectors:
_vector0:   VEC_ENTRY _c_int00    ;RESET
_vector1:   VEC_ENTRY _vec_dummy  ;NMI
_vector2:   VEC_ENTRY _vec_dummy  ;RSVD
_vector3:   VEC_ENTRY _vec_dummy
_vector4:   VEC_ENTRY _vec_dummy
_vector5:   VEC_ENTRY _vec_dummy
_vector6:   VEC_ENTRY _vec_dummy
_vector7:   VEC_ENTRY _vec_dummy
_vector8:   VEC_ENTRY _c_int08   ; Hookup the c_int08 ISR in main()
_vector9:   VEC_ENTRY _vec_dummy
_vector10:  VEC_ENTRY _vec_dummy
_vector11:  VEC_ENTRY _vec_dummy
_vector12:  VEC_ENTRY _vec_dummy
_vector13:  VEC_ENTRY _vec_dummy
_vector14:  VEC_ENTRY _vec_dummy
_vector15:  VEC_ENTRY _vec_dummy

  关于DSP/BIOS HWI 我还是太不熟悉,可否简单给我讲解一下,我在程序中需要使用EDMA中断接收MCASP传来的数据和I2C中断接收单片机发来的数据,分别使用C_int08和C_int14,请针对我这种情况简单说一下操作步骤,真的很谢谢你,给我回帖这么及时,再次感谢!!!!
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

20
 
能否给一个错误的例子,MCU发送的是什么数据,I2C接收的是什么数据。

你用了
.global _c_int08  ; Hookup the c_int08 ISR in main()
这句话相当于.ref _c_int08
详细请看.globa的说明

关于HWI,一两句话说不太明白的。
我前面写过一点:
我是用dsp/bios设置的HWI.
我选择的HWI_INT13,设置其interrupt source 为 I2C_Interrupt_0
function 为 _I2C_isr
Use Dispatcher为True
然后写函数I2C_isr
注意这里的I2C_isr不需要用interrupt关键字声明。

我看你的程序是自己写的中断向量表,如果用DSP/BIOS的话,中断向量表应该是DSP/BIOS自己建立的。所以具体你的程序如何修改才能用HWI我也不太清楚。
不过不用HWI也没有问题的,只要你的中断服务程序不会占用DSP很长时间。
 
 
 

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

随便看看
查找数据手册?

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