4054|4

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于硬件IIC通信的问题请教! [复制链接]

利用1611上的硬件IIC通信,同一430打算利用主发送方式、从接收方式2种方式来进行数据通信。
在调试中发现:发送数据后对方能接收到,但对方回发数据却接收不到或乱码(2机对联,通信方式一样,即发送时都为主,接收时都为从),这是为什么?接收和发送数据都跟I2CNDAT这个寄存器有关吗?这会涉及到总线冲突不?

最新回复

代码如下,大牛们看看:主从机配置代码一样,只是命令码不同 #include"msp430x16x.h" #pragma vector=USART0TX_VECTOR __interrupt void I2C_ISR(void);     void IIC_senddat(unsigned char S_count,unsigned char *D); void delay(unsigned int num); void intIIC(void); unsigned char TXdata[10]={0x42,0x50,};//0x0a}; char l=0; void main(void) {   WDTCTL=WDTPW+WDTHOLD;   P5DIR|=BIT0;      // test_led   P5OUT&=~BIT0;   intIIC();   _EINT();   P5OUT|=BIT0;   delay(50);   P5OUT&=~BIT0;   TXdata[2]=0x81;   while(1)   {     if(TXdata[2]==0x81)     {                   TXdata[2]=0x0a;       IIC_senddat(3,TXdata);       P5OUT^=BIT0;              delay(200);       intIIC();     }   } } #pragma vector=USART0TX_VECTOR __interrupt void I2C_ISR(void) {    switch(I2CIV)    {      case 6:_NOP();        break;      case 10 :// 接收        TXdata[l]=I2CDRB;        l++;        if(l>2)l=0;        break;      case 12 :// 发送        I2CDRB=TXdata[l];        l++;        if(l>9)l=0;        break;    default:break;    } } // IIC发送数据 void IIC_senddat(unsigned char S_count,unsigned char *D) {   I2CNDAT=S_count;   U0CTL|=MST;   I2CSA=0X0048;                               // 主机发送目标地址:从地址   I2CTCTL |= I2CSTT+I2CTRX+ I2CSTP;           // Initiate transfer - write to sl××e   while((I2CIFG & NACKIFG) == 0x02);      for(char k=0;k<S_count;k++)   {     while ((I2CIFG & TXRDYIFG) == 0);     I2CDRB=TXdata[k];   }   while ((I2CTCTL & I2CSTP) == 0x02);       // Wait for Stop Condition   delay(50);   I2CTCTL &= ~I2CTRX; } void delay(unsigned int num) {   unsigned char i;   unsigned int l;   for(l=0;l<num;l++)     for(i=0;i<200;i++); } void intIIC(void) {   delay(50);   U0CTL=0;   U0CTL |= SWRST;                           // Reset USART state machine   U0CTL &= ~CHAR;   I2CIE&=~RXRDYIE;   I2CIFG=0;   P3SEL|=0X0A;   U0CTL|=I2C+SYNC;   U0CTL&=~I2CEN;   I2CTCTL|=I2CSSEL1;   I2COA=0X0050;     // 本机地址   I2CIE|=RXRDYIE+OAIFG;   U0CTL|=I2CEN;   delay(50); }  详情 回复 发表于 2008-10-17 10:05
 
点赞 关注

回复
举报

16

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
难道就没有人用过?!

IIC通信距离多远?
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
贴程序出来更好一些,呵呵。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
I2CTCTL |= I2CSTT+I2CTRX+ I2CSTP;

表示IIC通信开始,但地址未发送?
还是表示通信开始,从地址也发送了?

从地址需要单独发送吗?
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
代码如下,大牛们看看:主从机配置代码一样,只是命令码不同

#include"msp430x16x.h"

#pragma vector=USART0TX_VECTOR
__interrupt void I2C_ISR(void);

void IIC_senddat(unsigned char S_count,unsigned char *D);
void delay(unsigned int num);
void intIIC(void);

unsigned char TXdata[10]={0x42,0x50,};//0x0a};
char l=0;
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P5DIR|=BIT0; // test_led
P5OUT&=~BIT0;
intIIC();
_EINT();
P5OUT|=BIT0;
delay(50);
P5OUT&=~BIT0;
TXdata[2]=0x81;
while(1)
{
if(TXdata[2]==0x81)
{
TXdata[2]=0x0a;
IIC_senddat(3,TXdata);
P5OUT^=BIT0;

delay(200);
intIIC();
}
}
}
#pragma vector=USART0TX_VECTOR
__interrupt void I2C_ISR(void)
{
switch(I2CIV)
{
case 6:_NOP();
break;
case 10 :// 接收
TXdata[l]=I2CDRB;
l++;
if(l>2)l=0;
break;
case 12 :// 发送
I2CDRB=TXdata[l];
l++;
if(l>9)l=0;
break;
default:break;
}
}
// IIC发送数据
void IIC_senddat(unsigned char S_count,unsigned char *D)
{
I2CNDAT=S_count;
U0CTL|=MST;
I2CSA=0X0048; // 主机发送目标地址:从地址
I2CTCTL |= I2CSTT+I2CTRX+ I2CSTP; // Initiate transfer - write to sl××e
while((I2CIFG & NACKIFG) == 0x02);

for(char k=0;k<S_count;k++)
{
while ((I2CIFG & TXRDYIFG) == 0);
I2CDRB=TXdata[k];
}
while ((I2CTCTL & I2CSTP) == 0x02); // Wait for Stop Condition
delay(50);
I2CTCTL &= ~I2CTRX;
}
void delay(unsigned int num)
{
unsigned char i;
unsigned int l;
for(l=0;l<num;l++)
for(i=0;i<200;i++);
}
void intIIC(void)
{
delay(50);
U0CTL=0;
U0CTL |= SWRST; // Reset USART state machine
U0CTL &= ~CHAR;
I2CIE&=~RXRDYIE;
I2CIFG=0;
P3SEL|=0X0A;
U0CTL|=I2C+SYNC;
U0CTL&=~I2CEN;
I2CTCTL|=I2CSSEL1;
I2COA=0X0050; // 本机地址
I2CIE|=RXRDYIE+OAIFG;
U0CTL|=I2CEN;
delay(50);
}
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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