打印
[数据转换器-信号链]

求助 AD8344 初学者

[复制链接]
1189|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
billy0664|  楼主 | 2015-7-20 15:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初学者,不台明白 AD8344 16位8通道 驱动程序?


#include<stc12C5A60S2.h>
#define  uchar unsigned char
#define  uint unsigned int

sbit ADS_CS   = P2^3;
sbit ADS_DCLK = P2^1;
sbit ADS_DIN  = P2^4;
sbit ADS_BUSY = P3^5;
sbit ADS_DOUT = P2^0;

// (MSB)                                  (LSB)  
// BIT7 BIT6 BIT5 BIT4 BIT3   BIT2   BIT1 BIT0
//  S    A2   A1   A0   —    SGL/DIF  PD1  PD0
void ads_com(uchar ads_comchar)
{
    uchar i=0;
    for (i=8; i>0; i--)
    {
        ADS_DIN  = ads_comchar&0x80;//取最高位
        ADS_DCLK = 0;
        ADS_DCLK = 1;
        ads_comchar<<=1;//左移数据
    }
}

// (MSB)        (LSB)  
// BIT15 ...... BIT0
uint ads_dat(void)
{
    uint ads_datword = 0;
    uchar i=0;
    for (i=16; i>0; i--)
    {
        ads_datword<<=1;//左移数据
        ADS_DCLK = 0;
        if(ADS_DOUT==1) ads_datword = ads_datword|0x01;//最低位或
        ADS_DCLK = 1;
    }
    return(ads_datword);
}

void main()
{
    uint ADS_DataWord = 0;
   

    ADS_CS   = 1;
    ADS_DCLK = 0;
   
    ADS_CS   = 0;
    //  S    A2   A1   A0   —    SGL/DIF  PD1  PD0
    //  1    0    0    0    —       1      1    1
    ads_com(0x87);//10000111 输入控制命令
    ADS_DCLK = 0;
    ADS_DCLK = 1;
    while(ADS_BUSY == 1);
    ADS_DataWord = ads_dat();
   
    ADS_CS   = 1;
    while(1);
}

相关帖子

沙发
airwill| | 2015-7-20 19:36 | 只看该作者
支持一下新人.
void ads_com(uchar ads_comchar);
这是个软件模拟 SPI 的通信输出函数.
uint ads_dat(void);
则是个软件模拟 SPI 的通信输入函数.

void main();
只是设置了一个命令, 还不完整. 对照手册应该不能理解了

使用特权

评论回复
板凳
xyz549040622| | 2015-7-21 08:00 | 只看该作者
对着时序图,你就看懂了。模拟时序都是通过移位来实现的。

使用特权

评论回复
地板
billy0664|  楼主 | 2015-7-21 09:43 | 只看该作者
airwill 发表于 2015-7-20 19:36
支持一下新人.
void ads_com(uchar ads_comchar);
这是个软件模拟 SPI 的通信输出函数.

是的, void ads_com 是DIN 读入控制命令  取高位表示 将控制命令一位一位 输入 ADS8344

ADS_DAT 是DOUT 输出 转换后的16位 结果, 我的问题是在于为什么这个是取地位 或1 然后左移呢

使用特权

评论回复
5
airwill| | 2015-7-21 17:35 | 只看该作者
问题是在于为什么这个是取地位 或1 然后左移呢

        ads_datword<<=1;//左移数据
        ADS_DCLK = 0;
        if(ADS_DOUT==1) ads_datword = ads_datword|0x01;//最低位或
        ADS_DCLK = 1;

这里是先左移一位, 最低位是待输入的数据.
接下来是个判断, 如果输入高电平, 那就 |1, 也就是最低位置1, 否则默认左移后为0

使用特权

评论回复
6
billy0664|  楼主 | 2015-7-22 10:02 | 只看该作者
airwill 发表于 2015-7-21 17:35
问题是在于为什么这个是取地位 或1 然后左移呢

        ads_datword

嗯,的确根据时序图能容易理解这个。
另外问一个问题, 在 输入控制命令的时候 也是用的左移1位,然后与最高位 ADS_DIN = 1000 0000,然后DCLK 出现一个上升沿锁定数据,之后左移一位 ADS_COMCHAR = 000001110, ADS_DIN = 0000 0000 ,依次下去 把控制命令的8位都 输入 ADS_DIN, 我想请问 在DIN 的控制命令是一位一位的 输入 ADS8344么?  万分感谢@
for (i=8; i>0; i--)
    {
        ADS_DIN  = ads_comchar&0x80;//取最高位 ads_comchar = 0x 87 (1000 0111)
        ADS_DCLK = 0;
        ADS_DCLK = 1;
        ads_comchar<<=1;//左移数据
    }

使用特权

评论回复
7
airwill| | 2015-7-22 18:31 | 只看该作者
请问 在DIN 的控制命令是一位一位的 输入 ADS8344么?

完全正确. 问这个问题, 说明对 SPI 接口还不太清楚, 要仔细理解一下.

使用特权

评论回复
8
billy0664|  楼主 | 2015-7-23 16:12 | 只看该作者
airwill 发表于 2015-7-22 18:31
请问 在DIN 的控制命令是一位一位的 输入 ADS8344么?

完全正确. 问这个问题, 说明对 SPI 接口还不太清楚 ...

目前,做到了对 单通道 单词采集。 如果是单通道多次采集呢? 这里我看时序图设计到一个问题,最后一位DOUT 输出的同事,新的控制命令需要读入,BUSY 无变化继续低电平 这里应该怎么写才能达到要求?

使用特权

评论回复
9
airwill| | 2015-7-23 19:09 | 只看该作者
SPI 接口自动会逐位发送传递的.
你应该考虑的是, 确认和验证数据发送的时序的准确性. 还是建议你借助示波器或逻辑分析仪里帮助你. 验证时序的时候, 你可以先发送特定的人识别比较容易的数据, 未必考虑其控制的合法性.

使用特权

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

本版积分规则

2

主题

7

帖子

0

粉丝