打印

求助:关于用模拟I2C时序的方法读取Cys TST120中的数据问题?

[复制链接]
3566|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
trivis|  楼主 | 2010-4-18 23:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的前端是一个触摸屏和Cys TST120组成,想将触摸屏上测得的(电容数据)坐标值,由Cys TST120将原始数据通过I2C接口传到我的51单片机上, 用串口打印出数据,但是一直读出来没有数据,不知是时序的问题,还是Cys TST120 在读写控制上有什么特别的要求?还望高手指点迷津:)
沙发
rocky_bian| | 2010-4-19 10:36 | 只看该作者
你可以直接把原始数据通过串口 在pc上打印出来啊 ,很方便 要先确认cy 的MCU的波特率

使用特权

评论回复
板凳
rocky_bian| | 2010-4-19 20:02 | 只看该作者
TST120一般公司 都拿不到这种芯片的 ,难道你们是ITO 大厂!!!好奇一问

使用特权

评论回复
地板
llljh| | 2010-4-19 20:49 | 只看该作者
为啥一般公司拿不到?

使用特权

评论回复
5
trivis|  楼主 | 2010-4-20 20:14 | 只看该作者
我也不清楚,这是我导师给我的。叫我学习着控制,有很多不明白,还望高人指点啊!

使用特权

评论回复
6
trivis|  楼主 | 2010-4-20 20:17 | 只看该作者
现在我也是通过串口,按照规定的时序读写,可就是一个数据都没有,相当的杯具!三楼的朋友,能不能指点一下呀:)

使用特权

评论回复
7
rocky_bian| | 2010-4-20 21:01 | 只看该作者
明天发如何设置的,程序在公司电脑里

使用特权

评论回复
8
trivis|  楼主 | 2010-4-20 21:42 | 只看该作者
:$附:从器件的7位I2C地址为0x20,寄存器0x00~0x35 是原始数据寄存器的地址,0x36是读取完成寄存器的地址。规定在读取或者处理完成原始数据之后,控制器要写入一个"0"到读取完成寄存器(0x36)中。我现在仅仅是读取的第一个寄存器0x00的数据;
(还望高人指点迷津!)
#include <reg52.h>        
#include <intrins.h>     
#define        OP_WRITE    0x20                // 器件地址以及读取操作
#define        OP_READ            0x21                // 器件地址以及写操作
#define        OK_Register     0x36         //读取完成寄存器地址
sbit SDA=P2^3;          //将串行数据总线SDA位定义在为P2.3引脚
sbit SCL=P2^2;         //将串行时钟总线SDA位定义在为P2.2引脚
/*****************************************************
函数功能:微妙级别的延时函数
***************************************************/
void delay()
{;;}

/*****************************************************
函数功能:延时1ms
***************************************************/
void delay1ms()
{
   unsigned char i,j;       
         for(i=0;i<10;i++)
          for(j=0;j<33;j++)
           ;                 
}

/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delaynms(unsigned char n)
{
   unsigned char i;
        for(i=0;i<n;i++)
           delay1ms();
}
/***************************************************
函数功能:开始数据传送
***************************************************/
void start()
{
        SDA = 1;    //SDA初始化为高电平“1”
           SCL = 1;    //开始数据传送时,要求SCL为高电平“1”
        _nop_();    //等待一个机器周期
        _nop_();    //等待一个机器周期
        _nop_();    //等待一个机器周期
        _nop_();    //等待一个机器周期
        SDA = 0;    //SDA的下降沿被认为是开始信号
        _nop_();    //等待一个机器周期
        _nop_();    //等待一个机器周期
        _nop_();    //等待一个机器周期
        _nop_();    //等待一个机器周期
        SCL = 0;    //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)  
}
/***************************************************
函数功能:结束数据传送
***************************************************/
void stop()
{
        SDA = 0;     //SDA初始化为低电平“0”        _n
        SCL = 1;     //结束数据传送时,要求SCL为高电平“1”
        _nop_();     //等待一个机器周期
        _nop_();     //等待一个机器周期
        _nop_();     //等待一个机器周期
        _nop_();     //等待一个机器周期
        SDA = 1;    //SDA的上升沿被认为是结束信号
        _nop_();     //等待一个机器周期
        _nop_();     //等待一个机器周期
        _nop_();     //等待一个机器周期
        _nop_();     //等待一个机器周期
        SDA=0;
        SCL=0;
}
/***************************************************
函数功能:器件的应答
***************************************************/
void response()
{
        unsigned char i;
        SCL=1;
        _nop_();     //等待一个机器周期
        _nop_();     //等待一个机器周期
        _nop_();     //等待一个机器周期
        _nop_();     //等待一个机器周期
        while((SDA==1)&&(i<255)) i++;
        SCL=0;
        _nop_();     //等待一个机器周期
        _nop_();     //等待一个机器周期
        _nop_();     //等待一个机器周期
        _nop_();     //等待一个机器周期

}
/***************************************************
函数功能:从TST120读取数据
出口参数:x
***************************************************/
unsigned char ReadData()
{
        unsigned char i;
        unsigned char x;                 
        SCL=0;                       
        delay();                         
        SDA=1;                                            
        delay();
        for(i = 0; i < 8; i++)
        {
                SCL = 1;               
                x<<=1;                 
                x|=(unsigned char)SDA;  
                SCL = 0;                     
        }
        return(x);              
}

/***************************************************
函数功能:向TST120的当前地址写入数据
***************************************************/
void  WriteCurrent(unsigned char y)                             
{
        unsigned char i;

        for(i = 0; i < 8; i++)               
        {
            SDA = (bit)(y&0x80);   
                                                  
        _nop_();           
           SCL = 1;            
           _nop_();            
          _nop_();           
               
          SCL = 0;            //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲
        y <<= 1;           //将y中的各二进位向左移一位
        }
        SDA = 1;                  // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,
                   
        _nop_();        //等待一个机器周期
        _nop_();        //等待一个机器周期
        SCL = 1;       //根据上述规定,SCL应为高电平
        _nop_();       //等待一个机器周期
        _nop_();       //等待一个机器周期
        _nop_();       //等待一个机器周期
        _nop_();       //等待一个机器周期

        SCL = 0;       //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)               
}

/***************************************************
函数功能:从CY中的当前地址读取数据
***************************************************/
unsigned char ReadCurrent()
{
        unsigned char date;
        start();                                       
        WriteCurrent(OP_WRITE);                   //时序上要求是先发8位的0x20
        response();
          //这个0x00是寄存器的起始地址   
        WriteCurrent(0x00);               
        response();

        start();                                       //需要重新开始
        WriteCurrent(OP_READ);                     //发送读取数据指令
        response();   

           //这个0x00是指明第零个寄存器  
        WriteCurrent(0x00);                //写入要读取原始寄存器0x00的数据地址
        delay();                                 
        stop();                                     //停止数据传递
        date=ReadData();                        //将读取的数据存入x
        delay();

        return date;              //返回读取的数据
}
void send_char(unsigned char txd)
// 传送一个字符
{
        SBUF = txd;
        while(!TI);                                // 等特数据传送
        TI = 0;                                        // 清除数据传送标志
}
/*********将0 写入读取完成寄存器当中 ****************/

void write_complete()
{
        start();
        WriteCurrent(OP_WRITE);
           response();
        WriteCurrent(OK_Register);
        response();
        WriteCurrent(0x00);  //此时的0x00 代表是写入的数据0 而不是寄存器的地址  
        response();
        stop();

}
void init_comm()
{

        TMOD = 0x20;        // 定时器1工作于8位自动重载模式, 用于产生波特率
        TH1 = 0xFD;        // 波特率9600
        TL1 = 0xFD;
       
        SCON = 0x50;        // 设定串行口工作方式
        PCON &= 0xef;        // 波特率不倍增
               
        TR1 = 1;                // 启动定时器1
        IE = 0x0;                // 禁止任何中断

}
void main()
{
        unsigned char date,tmp;
        init_comm();
              SDA = 1;           
        delay();
        SCL = 1;
        delay();
              date=ReadCurrent();
         delay();      

        while(1)
        {
        if(RI)                // 是否有数据到来
          {
            RI = 0;
          write_complete();
           tmp = SBUF;                // 暂存接收到的数据
                //P0 = tmp;                // 数据传送到P0口
          send_char(tmp);                // 回传接收到的数据
          }               
              }
}

使用特权

评论回复
9
springleo| | 2010-5-5 22:02 | 只看该作者
您好 我是厦大的一个研究生 最近也在弄Cys TST120 你搞定了吗? 器件地址应该是0x40 和0x41吧

使用特权

评论回复
10
rocky_bian| | 2010-5-6 12:23 | 只看该作者
LZ 1你为什么要自己模拟i2c的时序,psoc里面有i2c模块,

使用特权

评论回复
11
rocky_bian| | 2010-5-6 12:26 | 只看该作者
2.建议LZ 直接用psoc tst120 的uart 模块直接将rawcount通过超级终端 show出数据,

使用特权

评论回复
12
午夜粪车| | 2010-5-9 20:39 | 只看该作者
对自己这么自信啊

使用特权

评论回复
13
trivis|  楼主 | 2010-5-24 15:13 | 只看该作者
器件地址倒不是问题,改了没效果,后来换了一种往SDA送数据的方式和增加检验应答信号,就OK了。

使用特权

评论回复
14
午夜粪车| | 2010-5-24 22:11 | 只看该作者
关注中~~~

使用特权

评论回复
15
love_life| | 2010-5-24 22:12 | 只看该作者
好长的程序~~

使用特权

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

本版积分规则

0

主题

14

帖子

1

粉丝