找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2814|回复: 19
收起左侧

SPI读写AD7793,读寄存器值显示有误

[复制链接]
ID:743654 发表于 2021-8-23 16:03 | 显示全部楼层 |阅读模式
100黑币
SPI读写AD7793,复位AD7793,读配置寄存器初始值。逻辑分析仪抓取的数据跟复位值一样,但是串口打印和LCD显示(两者之间数据相同)的值跟复位值不一样,
最后ADC值我是要通过LCD显示的,所以现在不清楚到底哪个显示的值是正确的。

寄存器复位值.png
逻辑分析仪解析数据.jpg
串口打印数据.png
LCD显示数据.jpg
回复

使用道具 举报

ID:743654 发表于 2021-8-23 16:41 | 显示全部楼层
逻辑分析仪和串口是16进制数显示的,LCD是10进制显示。
回复

使用道具 举报

ID:743654 发表于 2021-8-23 16:46 | 显示全部楼层
本帖最后由 cheney03 于 2021-8-24 09:39 编辑

读写程序无误
回复

使用道具 举报

ID:615694 发表于 2021-8-23 16:50 | 显示全部楼层
抓取数据正确,所有肯定是你处理数据时转换不对造成的
回复

使用道具 举报

ID:207030 发表于 2021-8-23 17:05 | 显示全部楼层
串口肯定是对的,因为这是你单片机直接输出的  无非就是进制不同    LCD你可能打印了内码  不是原始数据   或者数据没打印对
回复

使用道具 举报

ID:313048 发表于 2021-8-23 17:10 | 显示全部楼层
这不是没问题吗,串口显示的是16进制的数吖,LCD显示的是10进制的数,两者是一样的,LCD默认显示的是10进制的数,而串口发出来的是原始数据,也就是16进制的数,有啥好纠结的,你如果想显示一样的话,你把串口的那个数据改为10进制就好了。
回复

使用道具 举报

ID:130230 发表于 2021-8-23 17:33 | 显示全部楼层
串口改成hex模式就好了,显示方式不同而已。值都是一样的。
回复

使用道具 举报

ID:743654 发表于 2021-8-24 08:39 | 显示全部楼层
AUG 发表于 2021-8-23 17:10
这不是没问题吗,串口显示的是16进制的数吖,LCD显示的是10进制的数,两者是一样的,LCD默认显示的是10进制 ...

问题不是在这,串口和LCD的数据是一样的,但是他们和逻辑分析仪的不一样,且逻辑分析仪的数据和手册上的复位值一样
回复

使用道具 举报

ID:743654 发表于 2021-8-24 08:40 | 显示全部楼层
jizhongbiao 发表于 2021-8-23 17:33
串口改成hex模式就好了,显示方式不同而已。值都是一样的。

问题不是在这,串口和LCD的数据是一样的,但是他们和逻辑分析仪的不一样,且逻辑分析仪的数据和手册上的复位值一样
回复

使用道具 举报

ID:743654 发表于 2021-8-24 08:41 | 显示全部楼层
QTW 发表于 2021-8-23 16:50
抓取数据正确,所有肯定是你处理数据时转换不对造成的

数据没处理,都是读完后直接显示的
回复

使用道具 举报

ID:743654 发表于 2021-8-24 08:41 | 显示全部楼层
QTW 发表于 2021-8-23 16:50
抓取数据正确,所有肯定是你处理数据时转换不对造成的

数据读完是后放在缓存数组中
回复

使用道具 举报

ID:743654 发表于 2021-8-24 08:53 | 显示全部楼层
以下是读写程序和主程序,我现在的主要问题是(串口和和&LCD显示的数据)为什么和逻辑分析以抓取的数据不一样
SPI写程序.png
SPI读程序.png
主程序.png
回复

使用道具 举报

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

明显这是用SPI模式3方式,是上升沿读取数据。
你读取数据时错了,要在上升沿后在读取数据(即CLK = 1后,再读取数据位就对了)
回复

使用道具 举报

ID:844772 发表于 2021-8-24 15:29 | 显示全部楼层
楼上说的对,是读数函数写反了,但写函数没错。另外,你写函数多了delay(3),所以低电平比高的时间长一倍,这不是手册要求的吧?不过0x07竟然能读对,也厉害啊。
回复

使用道具 举报

ID:743654 发表于 2021-8-24 17:32 | 显示全部楼层
glinfei 发表于 2021-8-24 15:29
楼上说的对,是读数函数写反了,但写函数没错。另外,你写函数多了delay(3),所以低电平比高的时间长一倍 ...

主要是逻辑分析以读出来的0x07,0x10,跟复位值一样,难道这个数据是错的?
回复

使用道具 举报

ID:743654 发表于 2021-8-24 17:33 | 显示全部楼层
glinfei 发表于 2021-8-24 15:29
楼上说的对,是读数函数写反了,但写函数没错。另外,你写函数多了delay(3),所以低电平比高的时间长一倍 ...

所以就没有怀疑读写程序有错
回复

使用道具 举报

ID:844772 发表于 2021-8-25 08:36 | 显示全部楼层
cheney03 发表于 2021-8-24 17:32
主要是逻辑分析以读出来的0x07,0x10,跟复位值一样,难道这个数据是错的?

你的截图只有0x07,没有0x10那段,说以不知道数据对否。
回复

使用道具 举报

ID:743654 发表于 2021-8-25 08:57 | 显示全部楼层
glinfei 发表于 2021-8-25 08:36
你的截图只有0x07,没有0x10那段,说以不知道数据对否。

我图片没截图好,要点开才看得到
回复

使用道具 举报

ID:743654 发表于 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;
}

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

回复

使用道具 举报

ID:844772 发表于 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;
            }
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表