标题: SPI读写AD7793,读寄存器值显示有误 [打印本页]

作者: cheney03    时间: 2021-8-23 16:03
标题: SPI读写AD7793,读寄存器值显示有误
SPI读写AD7793,复位AD7793,读配置寄存器初始值。逻辑分析仪抓取的数据跟复位值一样,但是串口打印和LCD显示(两者之间数据相同)的值跟复位值不一样,
最后ADC值我是要通过LCD显示的,所以现在不清楚到底哪个显示的值是正确的。

寄存器复位值.png (101.67 KB, 下载次数: 92)

寄存器复位值.png

逻辑分析仪解析数据.jpg (44.6 KB, 下载次数: 117)

逻辑分析仪解析数据.jpg

串口打印数据.png (11.82 KB, 下载次数: 109)

串口打印数据.png

LCD显示数据.jpg (92.11 KB, 下载次数: 102)

LCD显示数据.jpg

作者: cheney03    时间: 2021-8-23 16:41
逻辑分析仪和串口是16进制数显示的,LCD是10进制显示。
作者: cheney03    时间: 2021-8-23 16:46
本帖最后由 cheney03 于 2021-8-24 09:39 编辑

读写程序无误
作者: QTW    时间: 2021-8-23 16:50
抓取数据正确,所有肯定是你处理数据时转换不对造成的

作者: sgd985437    时间: 2021-8-23 17:05
串口肯定是对的,因为这是你单片机直接输出的  无非就是进制不同    LCD你可能打印了内码  不是原始数据   或者数据没打印对
作者: AUG    时间: 2021-8-23 17:10
这不是没问题吗,串口显示的是16进制的数吖,LCD显示的是10进制的数,两者是一样的,LCD默认显示的是10进制的数,而串口发出来的是原始数据,也就是16进制的数,有啥好纠结的,你如果想显示一样的话,你把串口的那个数据改为10进制就好了。
作者: jizhongbiao    时间: 2021-8-23 17:33
串口改成hex模式就好了,显示方式不同而已。值都是一样的。
作者: cheney03    时间: 2021-8-24 08:39
AUG 发表于 2021-8-23 17:10
这不是没问题吗,串口显示的是16进制的数吖,LCD显示的是10进制的数,两者是一样的,LCD默认显示的是10进制 ...

问题不是在这,串口和LCD的数据是一样的,但是他们和逻辑分析仪的不一样,且逻辑分析仪的数据和手册上的复位值一样
作者: cheney03    时间: 2021-8-24 08:40
jizhongbiao 发表于 2021-8-23 17:33
串口改成hex模式就好了,显示方式不同而已。值都是一样的。

问题不是在这,串口和LCD的数据是一样的,但是他们和逻辑分析仪的不一样,且逻辑分析仪的数据和手册上的复位值一样
作者: cheney03    时间: 2021-8-24 08:41
QTW 发表于 2021-8-23 16:50
抓取数据正确,所有肯定是你处理数据时转换不对造成的

数据没处理,都是读完后直接显示的
作者: cheney03    时间: 2021-8-24 08:41
QTW 发表于 2021-8-23 16:50
抓取数据正确,所有肯定是你处理数据时转换不对造成的

数据读完是后放在缓存数组中
作者: cheney03    时间: 2021-8-24 08:53
以下是读写程序和主程序,我现在的主要问题是(串口和和&LCD显示的数据)为什么和逻辑分析以抓取的数据不一样

SPI写程序.png (36.51 KB, 下载次数: 80)

SPI写程序.png

SPI读程序.png (34.01 KB, 下载次数: 86)

SPI读程序.png

主程序.png (27.57 KB, 下载次数: 94)

主程序.png

作者: QTW    时间: 2021-8-24 09:48
cheney03 发表于 2021-8-24 08:53
以下是读写程序和主程序,我现在的主要问题是(串口和和&LCD显示的数据)为什么和逻辑分析以抓取的数据不一样 ...

明显这是用SPI模式3方式,是上升沿读取数据。
你读取数据时错了,要在上升沿后在读取数据(即CLK = 1后,再读取数据位就对了)
作者: glinfei    时间: 2021-8-24 15:29
楼上说的对,是读数函数写反了,但写函数没错。另外,你写函数多了delay(3),所以低电平比高的时间长一倍,这不是手册要求的吧?不过0x07竟然能读对,也厉害啊。
作者: cheney03    时间: 2021-8-24 17:32
glinfei 发表于 2021-8-24 15:29
楼上说的对,是读数函数写反了,但写函数没错。另外,你写函数多了delay(3),所以低电平比高的时间长一倍 ...

主要是逻辑分析以读出来的0x07,0x10,跟复位值一样,难道这个数据是错的?
作者: cheney03    时间: 2021-8-24 17:33
glinfei 发表于 2021-8-24 15:29
楼上说的对,是读数函数写反了,但写函数没错。另外,你写函数多了delay(3),所以低电平比高的时间长一倍 ...

所以就没有怀疑读写程序有错
作者: glinfei    时间: 2021-8-25 08:36
cheney03 发表于 2021-8-24 17:32
主要是逻辑分析以读出来的0x07,0x10,跟复位值一样,难道这个数据是错的?

你的截图只有0x07,没有0x10那段,说以不知道数据对否。
作者: cheney03    时间: 2021-8-25 08:57
glinfei 发表于 2021-8-25 08:36
你的截图只有0x07,没有0x10那段,说以不知道数据对否。

我图片没截图好,要点开才看得到
作者: cheney03    时间: 2021-8-25 09:20
QTW 发表于 2021-8-24 09:48
明显这是用SPI模式3方式,是上升沿读取数据。
你读取数据时错了,要在上升沿后在读取数据(即CLK = 1后 ...

void WriteToReg(unsigned char ByteData) // write ByteData to the register
{
        unsigned char temp;
        int i;       
        AD7793_CS3=0;
        temp=0x80;
        for(i=0;i<8;i++)
        {
            if((temp & ByteData)==0)
           {               
              AD7793_DIN=0;
            }       
            else
           {
              AD7793_DIN=1;
                 }
         AD7793_CLK=0;
         Delay(10);
         AD7793_CLK=1;
         Delay(10);
         temp=temp>>1;
      }
     AD7793_CS3=1;
}


void ReadFromReg(unsigned char nByte) // nByte is the number of bytes which need to be read
{
   int i,j;
   unsigned char temp;
   AD7793_DIN=1;
   AD7793_CS3=0;
   temp=0;
   AD7793_DOUT=1;

        for(i=0; i<nByte; i++)
        {
                for(j=0; j<8; j++)
            {
                     AD7793_CLK=0;
                     if(AD7793_DOUT==0)
                     {
                   temp=temp<<1;
                }
              else
                {
                  temp=temp<<1;
                  temp=temp+0x01;
                }
                delay(3);
                AD7793_CLK=1;
                delay(3);
            }
        DataRead=temp;
        temp=0;
        }
    AD7793_CS3=1;
}

这个是官方的读写例程,跟我的读写出来的数据也是一样的


作者: glinfei    时间: 2021-8-25 14:40
cheney03 发表于 2021-8-25 09:20
void WriteToReg(unsigned char ByteData) // write ByteData to the register
{
        unsigned char temp; ...

我看图,觉得分析仪对,就是0x0710,你看它就是在clk低电位i时准备信号,然后再高电位读出。
你改一下程序试试呗?就把读函数中间的循环改成如下:
       for(j=0; j<8; j++)
            {
                AD7793_CLK=0;
                delay(3);
                AD7793_CLK=1;
                delay(3);
                temp<<=1;               
                if(AD7793_DOUT)
                    temp|=0x01;
            }




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1