打印

有哪位有TMP275的C51完整程序么

[复制链接]
2847|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
joly314|  楼主 | 2014-5-24 22:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
dirtwillfly| | 2014-5-25 14:16 | 只看该作者
检查下时序吧

使用特权

评论回复
板凳
joly314|  楼主 | 2014-5-26 18:55 | 只看该作者
本帖最后由 joly314 于 2014-5-26 19:11 编辑
dirtwillfly 发表于 2014-5-25 14:16
检查下时序吧


void stopa(void)
{
  delayxus(6); SCL=0;
  delayxus(6); SDA=0;
  delayxus(6); SCL=1;
  delayxus(6); SDA=1;
  EA=1;
}

void TransStart(){
        SDA=1;
        SCL=0;
        delayxus(5);
        SCL=1;
        delayxus(5);
        SDA=0;
        delayxus(5);
        SCL=0;
        delayxus(5);
        SCL=1;
        delayxus(5);
        SDA=1;
        delayxus(5);
        SCL=0;
        delay_us(5);
}
uchar ReadByte(uchar ack)//包括读字节后继续读和读完后停止数据线
{
        unsigned char i,val=0;
        SDA=1;
        for(i=0x80;0<i;i/=2)
        {
                SCL=1;
                delayxus(5);
                if(SDA==1)
                        val=(val|i);
                delayxus(5);
                SCL=0;
                delayxus(5);
        }
        if(ack==1) //1表示继续数据传输,0表示结束读;        
                SDA=0;
        else
                SDA=1;
        delayxus(5);
        SCL=1;
        delayxus(5);
        SCL=0;         
        delayxus(5);
        SDA=1;
        return val;
}

uchar  WriteByte(uchar value)
{//从高位开始发送
        uchar i,error=0;
        for(i=0x80;0<i;i/=2)
        {
                if(i&value)
                        SDA=1;
                else
                        SDA=0;
                SCL=1;
                delayxus(5);
                SCL=0;
        }
        SDA=1;//release DATA-line
        SCL=1;//clk #9 for ack
        delayxus(5);
        error=SDA;//DATA在第9个上升沿将被SHT10自动下拉为低电平
        delay_us(5);
        SCL=0;
        SDA=1;//release DATA-line
        return error;
}
以上是可以正常读取其他IIC总线的程序,用在TMP275上就不可以,读出的每个字节都是0XFF,不知道什么原因,

使用特权

评论回复
地板
dirtwillfly| | 2014-5-26 20:56 | 只看该作者
joly314 发表于 2014-5-26 18:55
void stopa(void)
{
  delayxus(6); SCL=0;

:L不同的器件对IIC时序的要求可能不完全相同,对照TMP275的手册检查时序
另外,你的TMP275部分的电路有没有问题,检查过没有?

使用特权

评论回复
5
joly314|  楼主 | 2014-5-26 21:53 | 只看该作者
本帖最后由 joly314 于 2014-5-26 21:55 编辑

A0,A1,A2通过上拉电阻后接地,读是0X91,写是0X90,存储器01写如0X60(连续方式),这些我都有处理啊,但是就是读不出来,时序我也有对啊,没有问题啊,真不知道问题在哪,哎,惭愧,按照道理,24C04什么的IIC也写过不少,但是现在就这个读不了。求救啊!!!

使用特权

评论回复
6
joly314|  楼主 | 2014-5-26 22:15 | 只看该作者
本帖最后由 joly314 于 2014-5-26 22:17 编辑

/********************************************************  
*   文件名称:  
*               tmp275.c  
*       文件说明:  
*       使用口线模拟IIC读取 tmp275 温度值  
         口对应:  SDA--P6.7   SCL--P6.6  
*********************************************************/   
   
#include <msp430x44x.h>   
   
#define uchar unsigned char   
#define uint unsigned int   
   
/*********************************************************  
  相关口及寄存器定义,若要换IO口,只需修改这7句即可  
*********************************************************/   
#define OUTPUT_ZERO  P6OUT &= ~(BIT6+BIT7)      
#define IN           P6IN   
#define SDA          BIT7   
#define SDA_HIGH     P6DIR &= ~BIT7   
#define SDA_LOW      P6DIR |= BIT7   
#define SCL_HIGH     P6DIR &= ~BIT6   
#define SCL_LOW      P6DIR |= BIT6   
/*********************************************************  
*   数据定义  
*********************************************************/   
unsigned char temp1,     //温度值高字节   
              temp2,     //温度值低字节   
          ack_Flag;  //应答标识   
/************************************************  
*   延迟  
************************************************/   
void iic_Delay(void)   
{   
   _NOP();   
   _NOP();   
   _NOP();      
}   
/*********************************************************  
*   启动IIC  
*********************************************************/   
void start_IIC(void)   
{   
     OUTPUT_ZERO; //设置P6OUT   
     SDA_HIGH;  //SDA = 1   
     iic_Delay();   
     SCL_HIGH;  //SCL = 1   
     iic_Delay();   
     SDA_LOW;   //SDA = 0   
     iic_Delay();   
     SCL_LOW;   //SCL = 0   
     iic_Delay();   
        
}   
/*******************************************************  
*   停止IIC  
*******************************************************/   
void stop_IIC(void)   
{   
     SDA_LOW;   //SDA = 0   
     iic_Delay();   
     SCL_HIGH;  //SCL = 1   
     iic_Delay();   
     SDA_HIGH;  //SDA = 1   
     iic_Delay();   
     SDA_LOW;   //SDA = 0   
     iic_Delay();   
     SCL_LOW;   //SCL = 0   
}   
   
/*******************************************************  
*   发送 0  
*******************************************************/   
void send_Zero(void)   
{   
     SDA_LOW;   //SDA = 0   
     iic_Delay();   
     SCL_HIGH;  //SCL = 1   
     iic_Delay();   
     SCL_LOW;   //SCL = 0   
     iic_Delay();   
        
}   
/*******************************************************  
*   发送 1  
*******************************************************/   
void send_One(void)   
{      
     SDA_HIGH;  //SDA = 1   
     iic_Delay();   
     SCL_HIGH;  //SCL = 1   
     iic_Delay();   
     SCL_LOW;   //SCL = 0   
     iic_Delay();   
     SDA_LOW;   //SDA = 0   
   //  iic_Delay();     
}   
/*******************************************************  
*   发送一个字节数据  
*******************************************************/   
void send_Char(uchar x)   
{   
     uchar cnt,tmp=0x80;   
     for(cnt=0;cnt<8;cnt++)   
     {   
        if((x & tmp )> 0)   
             send_One();        // 发送1   
        else   
             send_Zero();   // 发送0   
        tmp /= 2;       // tmp右移一位   
     }     
}   
   
/*******************************************************  
*   读一个byte数据  
*******************************************************/   
uchar read_Char(void)   
{   
     uchar cnt,tmp=0x80;   
     uchar x = 0x00;   
     for(cnt=0;cnt<8;cnt++)   
     {   
        SDA_HIGH;   //SDA = 1   
        iic_Delay();   
        SCL_HIGH;   //SCL = 1   
        iic_Delay();   
        if((IN & SDA) > 0x00)  // 收到 1   
            x |= tmp;   
        SCL_LOW;  //SCL = 0   
        iic_Delay();   
        tmp = tmp/2;   
     }   
     return x;   
}   
   
/*************************************************  
*   应答信号  
*************************************************/   
void iic_ACK(void)   
{        
     ack_Flag = 0x00;   
     SDA_HIGH;  //SDA = 1   
     iic_Delay();   
     SCL_HIGH;  //SCL = 1   
     iic_Delay();   
     if ((IN & BIT7) >0 )   
     {   
        ack_Flag = 1;   
     }   
     SCL_LOW;   //SCL = 0   
    iic_Delay();   
         
}   
/***********************************************  
*  iic_NACK  
************************************************/   
void iic_NACK(void)   
{   
     SDA_LOW;   //SDA = 0   
     iic_Delay();   
     SCL_HIGH;  //SCL = 1   
     iic_Delay();   
     SCL_LOW;   //SCL = 0   
     iic_Delay();   
}   
   
/************************************************  
*   写一个数据到tmp275  
*************************************************/   
void write_tmp275(uchar register_addr,uchar content)   
{   
         start_IIC();      // 启动 I2c   
         send_Char(0x90); // 发送器件地址   
         iic_ACK(); // 确认   
         send_Char(register_addr); // 发送寄存器地址   
     iic_ACK();                // 读确认     
     send_Char(content);       // 写入数值     
     iic_ACK();            // 读响应信息   
     stop_IIC();                // 停止 IIC            
}   
/*************************************************  
*   从tmp275读数据  
*************************************************/   
void read_temperature(void)   
{   
     start_IIC();       //启动 I2c   
     send_Char(0x90);//发送器件地址   
     iic_ACK();         //读取应答   
     send_Char(0x00);     // 发送寄存器地址   
     iic_ACK();             // 读响应   
     start_IIC();       //启动 I2c   
     send_Char(0x91);      // 发送器件地址   
     iic_ACK();            // 获取响应   
     temp1 = read_Char();  //读温度寄存器高字节   
     iic_NACK();         // 主设备发响应   
     temp2 = read_Char();  //读温度寄存器高字节   
     iic_NACK();         // 主设备发响应   
     stop_IIC();                  // 停止 IIC   
}   

/********************************************************
*        文件名称:
*               tmp275.c
*       文件说明:
*                使用口线模拟IIC读取 tmp275 温度值
         口对应:  SDA--P6.7   SCL--P6.6
*********************************************************/

#include <msp430x44x.h>

#define uchar unsigned char
#define uint unsigned int

/*********************************************************
  相关口及寄存器定义,若要换IO口,只需修改这7句即可
*********************************************************/
#define OUTPUT_ZERO  P6OUT &= ~(BIT6+BIT7)   
#define IN           P6IN
#define SDA          BIT7
#define SDA_HIGH     P6DIR &= ~BIT7
#define SDA_LOW      P6DIR |= BIT7
#define SCL_HIGH     P6DIR &= ~BIT6
#define SCL_LOW      P6DIR |= BIT6
/*********************************************************
*        数据定义
*********************************************************/
unsigned char temp1,     //温度值高字节
              temp2,     //温度值低字节
              ack_Flag;  //应答标识
/************************************************
*        延迟
************************************************/
void iic_Delay(void)
{
   _NOP();
   _NOP();
   _NOP();   
}
/*********************************************************
*        启动IIC
*********************************************************/
void start_IIC(void)
{
     OUTPUT_ZERO; //设置P6OUT
     SDA_HIGH;        //SDA = 1
     iic_Delay();
     SCL_HIGH;        //SCL = 1
     iic_Delay();
     SDA_LOW;        //SDA = 0
     iic_Delay();
     SCL_LOW;        //SCL = 0
     iic_Delay();
      
}
/*******************************************************
*        停止IIC
*******************************************************/
void stop_IIC(void)
{
     SDA_LOW;        //SDA = 0
     iic_Delay();
     SCL_HIGH;        //SCL = 1
     iic_Delay();
     SDA_HIGH;        //SDA = 1
     iic_Delay();
     SDA_LOW;        //SDA = 0
     iic_Delay();
     SCL_LOW;        //SCL = 0
}

/*******************************************************
*        发送 0
*******************************************************/
void send_Zero(void)
{
     SDA_LOW;        //SDA = 0
     iic_Delay();
     SCL_HIGH;        //SCL = 1
     iic_Delay();
     SCL_LOW;        //SCL = 0
     iic_Delay();
      
}
/*******************************************************
*        发送 1
*******************************************************/
void send_One(void)
{   
     SDA_HIGH;        //SDA = 1
     iic_Delay();
     SCL_HIGH;        //SCL = 1
     iic_Delay();
     SCL_LOW;        //SCL = 0
     iic_Delay();
     SDA_LOW;        //SDA = 0
   //  iic_Delay();         
}
/*******************************************************
*        发送一个字节数据
*******************************************************/
void send_Char(uchar x)
{
     uchar cnt,tmp=0x80;
     for(cnt=0;cnt<8;cnt++)
     {
             if((x & tmp )> 0)
                  send_One();             // 发送1
        else
                  send_Zero();        // 发送0
             tmp /= 2;                // tmp右移一位
     }         
}

/*******************************************************
*        读一个byte数据
*******************************************************/
uchar read_Char(void)
{
     uchar cnt,tmp=0x80;
     uchar x = 0x00;
     for(cnt=0;cnt<8;cnt++)
     {
             SDA_HIGH;        //SDA = 1
             iic_Delay();
             SCL_HIGH;        //SCL = 1
             iic_Delay();
             if((IN & SDA) > 0x00)  // 收到 1
                 x |= tmp;
             SCL_LOW;  //SCL = 0
             iic_Delay();
             tmp = tmp/2;
     }
     return x;
}

/*************************************************
*        应答信号
*************************************************/
void iic_ACK(void)
{      
     ack_Flag = 0x00;
     SDA_HIGH;        //SDA = 1
     iic_Delay();
     SCL_HIGH;        //SCL = 1
     iic_Delay();
     if ((IN & BIT7) >0 )
     {
             ack_Flag = 1;
     }
     SCL_LOW;        //SCL = 0
    iic_Delay();
      
}
/***********************************************
*  iic_NACK
************************************************/
void iic_NACK(void)
{
     SDA_LOW;        //SDA = 0
     iic_Delay();
     SCL_HIGH;        //SCL = 1
     iic_Delay();
     SCL_LOW;        //SCL = 0
     iic_Delay();
}

/************************************************
*        写一个数据到tmp275
*************************************************/
void write_tmp275(uchar register_addr,uchar content)
{
         start_IIC();           // 启动 I2c
         send_Char(0x90); // 发送器件地址
         iic_ACK();        // 确认
         send_Char(register_addr); // 发送寄存器地址
         iic_ACK();                // 读确认  
         send_Char(content);           // 写入数值  
         iic_ACK();            // 读响应信息
         stop_IIC();                // 停止 IIC         
}
/*************************************************
*        从tmp275读数据
*************************************************/
void read_temperature(void)
{
     start_IIC();            //启动 I2c
     send_Char(0x90);//发送器件地址
     iic_ACK();                    //读取应答
     send_Char(0x00);     // 发送寄存器地址
     iic_ACK();             // 读响应
     start_IIC();            //启动 I2c
     send_Char(0x91);           // 发送器件地址
     iic_ACK();            // 获取响应
     temp1 = read_Char();  //读温度寄存器高字节
     iic_NACK();         // 主设备发响应
     temp2 = read_Char();  //读温度寄存器高字节
     iic_NACK();         // 主设备发响应
     stop_IIC();                  // 停止 IIC
}

上面这个程序网上下的,说是MSP430上验证过的,转成C51也不能读出来,真不知道问题在哪,郁闷啊

使用特权

评论回复
7
joly314|  楼主 | 2014-6-6 09:50 | 只看该作者
已经搞定,时间赶,事情多,没有静下心来搞,时序没有对准.

使用特权

评论回复
8
376220024| | 2014-8-29 23:25 | 只看该作者
能具体说一下你的情况吗?我遇到和你一样的问题

使用特权

评论回复
9
coody| | 2014-8-30 10:58 | 只看该作者
不就是一个IIC嘛,时序对,啥都好,时序不对,谁的程序都不好

使用特权

评论回复
10
376220024| | 2014-8-31 16:54 | 只看该作者
coody 发表于 2014-8-30 10:58
不就是一个IIC嘛,时序对,啥都好,时序不对,谁的程序都不好

高手就是高手.时序在此

使用特权

评论回复
11
风云天地雄| | 2015-10-25 16:10 | 只看该作者
楼主 有这个TMP275的程序吗???能发给我吗 ??最近在做这个,QQ邮箱,843079712@qq,com

使用特权

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

本版积分规则

10

主题

33

帖子

2

粉丝