找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2861|回复: 19
打印 上一主题 下一主题
收起左侧

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

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

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

寄存器复位值.png

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

逻辑分析仪解析数据.jpg

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

串口打印数据.png

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

LCD显示数据.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 | 只看该作者
抓取数据正确,所有肯定是你处理数据时转换不对造成的
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

7#
ID:130230 发表于 2021-8-23 17:33 | 只看该作者
串口改成hex模式就好了,显示方式不同而已。值都是一样的。
回复

使用道具 举报

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

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

使用道具 举报

9#
ID:743654 发表于 2021-8-24 08:40 | 只看该作者
jizhongbiao 发表于 2021-8-23 17:33
串口改成hex模式就好了,显示方式不同而已。值都是一样的。

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

使用道具 举报

10#
ID:743654 发表于 2021-8-24 08:41 | 只看该作者
QTW 发表于 2021-8-23 16:50
抓取数据正确,所有肯定是你处理数据时转换不对造成的

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

使用道具 举报

11#
ID:743654 发表于 2021-8-24 08:41 | 只看该作者
QTW 发表于 2021-8-23 16:50
抓取数据正确,所有肯定是你处理数据时转换不对造成的

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

使用道具 举报

12#
ID:743654 发表于 2021-8-24 08:53 | 只看该作者
以下是读写程序和主程序,我现在的主要问题是(串口和和&LCD显示的数据)为什么和逻辑分析以抓取的数据不一样

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

SPI写程序.png

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

SPI读程序.png

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

主程序.png
回复

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

17#
ID:844772 发表于 2021-8-25 08:36 | 只看该作者
cheney03 发表于 2021-8-24 17:32
主要是逻辑分析以读出来的0x07,0x10,跟复位值一样,难道这个数据是错的?

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

使用道具 举报

18#
ID:743654 发表于 2021-8-25 08:57 | 只看该作者
glinfei 发表于 2021-8-25 08:36
你的截图只有0x07,没有0x10那段,说以不知道数据对否。

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

使用道具 举报

19#
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;
}

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

回复

使用道具 举报

20#
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 单片机教程网

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