打印

望各位高人指教!

[复制链接]
1773|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
雁舞白沙|  楼主 | 2008-8-20 10:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ic, iic, sd, AD, TE
 

问题:此模拟IIC,在413上可以运行,读取和写入数据正常,但是在123上就不可以!

望各位高人指教!

#include <GLOBAL.h>
#include <stdlib.h>
#include <stdbool.h>
#include <msp430x12x.h>

#define BIT0                (0x0001)
#define BIT1                (0x0002)
#define BIT2                (0x0004)

#define IicWpDirOut           P1DIR |=  BIT2
#define IicWpDirIn            P1DIR &= ~BIT2
#define IicWpHig              P1OUT |=  BIT2             
#define IicWpLow              P1OUT &= ~BIT2


#define IicSclDirOut          P1DIR |=  BIT1
#define IicSclDirIn           P1DIR &= ~BIT1
#define IicSclHig             P1OUT |=  BIT1            
#define IicSclLow             P1OUT &= ~BIT1

#define IicSdaDirOut          P1DIR |=  BIT0 
#define IicSdaDirIn           P1DIR &= ~BIT0
#define IicSdaHig             P1OUT |=  BIT0             
#define IicSdaLow             P1OUT &= ~BIT0
#define IicSdaInSt            P1IN  &   BIT0 

bool AckErr;
unsigned char TimeDelay=10;
//-----***-IIC延时(一个nop是纳秒 10个大概是1.67微秒大概总线速度在300K符合IIC在写状态下400K的要求)-***-----//
void IicInit(void)
{
    IicWpDirOut;
    IicSdaDirOut;
    IicSclDirOut;
    IicWpHig;
    IicSdaHig;
    IicSclHig;
}
//-----***-IIC启示-***-----//
void IicStart(void)                                                        
{
      IicSdaHig;//IicSda=1;
    Delay(TimeDelay);
    IicSclHig;//IicScl=1;
    Delay(TimeDelay);
    IicSdaLow;//IicSda=0;
    Delay(TimeDelay);
    IicSclLow;//IicScl=0;
    Delay(TimeDelay);
}
//-----***-IIC停止-***-----//
void IicStop(void)                                                        
{
    IicSdaLow;//IicSda=0;
    Delay(TimeDelay);
    IicSclHig;//IicScl=1;
    Delay(TimeDelay);                                                        
    IicSdaHig;//IicSda=1;
    Delay(TimeDelay);
}
//-----***-IIC错误-***-----//
void IicErr(void)                                                
{
    AckErr=1;
    IicStop();
}
//-----***-IIC应答-***-----//
void SendAcknowledge(bool ack)                                                
{
    IicSdaDirOut;
      if(ack)//IicSda=ack;
    {
          IicSdaHig;
    }
    else
    {
         IicSdaLow; 
    }
    Delay(TimeDelay);
    IicSclHig;//IicScl=1;
    Delay(TimeDelay);
    IicSclLow;//IicScl=0;
    Delay(TimeDelay);
}             
//-----***-从slave端读取一个数据-***-----//
unsigned char IicReceiveByte(void)
{
    unsigned char i;
    unsigned char bytedata=0;
    
    IicSdaDirOut;
    IicSdaHig;//IicSda=1;
    IicSdaDirIn;
    
    for(i=0;i<8;i++)
    {
          IicSclHig;//IicScl=1;
        Delay(TimeDelay);
        bytedata<<=1;
        if(IicSdaInSt&BIT0)
        {
              bytedata |=0x01;
        }
        else
        {
             bytedata &=0xfe; 
        }
        IicSclLow;//IicScl=0;
        Delay(TimeDelay);
    }
    
    IicSdaDirOut;
    
    return bytedata;
}
//-----***-传送一个 Byte 数据到 slave-***-----//
bool IicSentByte(unsigned char DataByte)                                    
{
    unsigned char i;
    bool ack;
    ack=1;
    IicSdaDirOut;
    for(i=0;i<8;i++)
    {
        if(DataByte & 0x80)
        {
            IicSdaHig;//IicSda=1;
        }
        else
        {
            IicSdaLow;//IicSda=0;
        }
        DataByte <<=1;
        Delay(TimeDelay);
        IicSclHig;//IicScl=1;
        Delay(TimeDelay);
        IicSclLow;//IicScl=0;
        Delay(TimeDelay);
    }
    IicSdaHig;//IicSda=1;
    Delay(TimeDelay);
    IicSclHig;//IicScl=1;
    Delay(TimeDelay);
    IicSdaDirIn;
    if(IicSdaInSt&BIT0)
    {
            ack=0;  
    }
    else
    {
            ack=1; 
    }
    IicSdaDirOut;
    IicSclLow;//IicScl=0;
    Delay(TimeDelay);
    return ack;
}
//-----***-无扇区读---多字节-***-----//
//读取指定器件无扇区指定地址多字节数据到指定地址
//Device=器件地址---单字节 
//DataAdd=字节地址---单字节
void IicMuchByteRead(unsigned char Device,unsigned char DataAdd,unsigned char *DataDptr,unsigned char DataLend)
{
    unsigned char i;
    IicWpHig;
    IicStart();
    IicSentByte(Device);
    IicSentByte(DataAdd);
    IicStart();
    IicSentByte(Device|0x01);
    for(i=0;i<DataLend-1;i++)
    {
         *DataDptr=IicReceiveByte();
          DataDptr++;
          SendAcknowledge(0);
    }
    *DataDptr=IicReceiveByte();
    SendAcknowledge(1);
    IicStop();
}
//-----***-无扇区写---多字节-***-----//
//写入指定器件无扇区指定地址中的多字节数据
//Device=器件地址---单字节
//DataAdd=字节地址---双字节
//DataByte=被存放数据的地址
//DataLend=被存放数据的长度
void IicMuchByteWrite(unsigned char Device,unsigned char DataAdd,unsigned char *DataDptr,unsigned char DataLend)
{
    unsigned char i,j;
    for(i=0;i<3;i++)
    {
            AckErr=0;
            IicWpLow;
            IicStart();
            if(IicSentByte(Device)){IicErr();continue;}
            if(IicSentByte(DataAdd)){IicErr();continue;}
            for(j=0;j<DataLend;j++)
            {
                    if(IicSentByte(*DataDptr)){IicErr();continue;}
                    DataDptr++;
            }
            IicStop();
            if(!AckErr)
            {
                    break;
            }
    }
    IicWpHig; 
    Delay(50000);
}

相关帖子

沙发
雁舞白沙|  楼主 | 2008-8-20 12:31 | 只看该作者

继续等待!

使用特权

评论回复
板凳
雁舞白沙|  楼主 | 2008-8-20 13:41 | 只看该作者

再等!

使用特权

评论回复
地板
雁舞白沙|  楼主 | 2008-8-20 15:56 | 只看该作者

继续等待中!

使用特权

评论回复
5
emailli| | 2008-8-20 16:02 | 只看该作者

硬件,软件,电路======

硬件IO都一样?

都有上拉?

不通的CPU的指令时间都一样?

用的IIC芯片是否都是好的?

用示波器观察波形!电平是否正常?

用 逻辑分析仪抓数据,是否正常?

使用特权

评论回复
6
yewuyi| | 2008-8-20 17:17 | 只看该作者

检查一下IO口的方向设置

好象123和413在IO口附加功能上有所不同,如果在413上能用那估计IIC逻辑上没问题,应该是IO输出等硬件有问题。。。

没有示波器吗?用示波器看一下波形不就知道了吗?IIC可以单步一个CLOCK执行,用万用表应该都能量出来。。。。

使用特权

评论回复
7
古道热肠| | 2008-8-20 17:34 | 只看该作者

是通病吗?最好分清硬件故障还是软件故障

使用特权

评论回复
8
雁舞白沙|  楼主 | 2008-8-21 08:42 | 只看该作者

可能是IO口可以正常输出,但不能输入!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

213

主题

789

帖子

243

粉丝