打印

一个DA程序在PIC上的移植

[复制链接]
1427|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xyz549040622|  楼主 | 2013-6-14 21:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xyz549040622 于 2013-6-14 22:55 编辑

DA所用为AD5662,官方给的一段程序为
/*******************************************************************
*   Function:    AD5662_reg_write
*   Description: writes to the AD5662 via the SPI port.
                                 P1.4->SCLK,P1.6->DIN,P2.5->/SYNC
*******************************************************************/
void AD5662_reg_write(unsigned int Mode, unsigned int RegisterData)
{
        unsigned int ControlValue = 0;
        unsigned int i = 0;

        //Create the 24-bit
        ControlValue = (Mode << 16) | RegisterData;
        
        SET_CS();
        CLR_SCL();
        delay(3);
        CLR_CS();         //bring CS low
        delay(3);

        //Write out the control word
        for(i=0; i<24; i++)
        {
                SET_SCL();
                if(0x800000 == (ControlValue & 0x800000))
                {
                        SET_SDO();          //Send one to SDO pin
                }
                else
                {
                        CLR_SDO();          //Send zero to SDO pin
                }
                delay(3);
                CLR_SCL();
                delay(3);
                ControlValue <<= 1;        //Rotate data
        }
        
        SET_CS();        //bring CS high again
}

移植到PIC16F1936后的代码为
//************************DA写数据程序***********************************************
/*******************************************************************
*   Function:    AD5662_reg_write
*   Description:  输入参数为选通的通道号码,进行的模式,写入的数据
*******************************************************************/
void AD5662_reg_write(unsigned int En_DA_Num, unsigned long Mode, unsigned long RegisterData)
{
        unsigned long ControlValue = 0;
        unsigned int i = 0;
        ControlValue = (Mode << 16)| RegisterData;

        SET_CS();//片选位拉高
        CLR_SCL();//时钟拉高
        delayR();//延时
            delayR();//延时
            delayR();//延时
        switch(En_DA_Num)//根据使能的口,拉低片选位,使数据有效
        {
        case 1: CLR_CS1(); break;
        case 2: CLR_CS2(); break;
        case 3: CLR_CS3(); break;
        case 4: CLR_CS4(); break;
        case 5: CLR_CS5(); break;
        case 6: CLR_CS6(); break;
        case 7: CLR_CS7(); break;
        default: SET_CS(); break;//如果都不是,Y1-Y7都关闭,此时无法写入数据
        }
        delayR();//延时
        //Write out the control word
        for(i=0; i<24; i++)
        {
                SET_SCL();//时钟拉高
                if(0x800000 == (ControlValue & 0x800000))//发送数据
                {
                        SET_SDO();          //Send one to SDO pin
                }
                else
                {
                        CLR_SDO();          //Send zero to SDO pin
                }
                delayR();//数据保持
                        CLR_SCL();//时钟拉低
                        delayR();//数据保持
                ControlValue <<= 1;        //Rotate data
                        delayR();//数据保持
        

        }
        SET_CS();//把片选位拉高
            delayR();//数据保持
}
void delayR()//延时1us,16MHZ
{
        NOP();NOP();NOP();NOP();
}

只修改延时函数,但是DA结果无输出,官方的程序应该也是没错的,那么移植过程哪里出错了呢?

沙发
弓长月月鸟| | 2013-6-15 08:07 | 只看该作者
.仔细看了一下您的程序,自己有几点看法:
1、首先你修改了延时程序,是否跟例程中的延时一致?
2、例程中只是用了一个SET_CS();//片选位拉高,按照我对你程序的理解。你的程序应该是对CS选择了多个。但是12行和49行是不是也应该和19——27行的代码一致呢?
希望能帮助您。


使用特权

评论回复
板凳
xyz549040622|  楼主 | 2013-6-15 18:37 | 只看该作者
弓长月月鸟 发表于 2013-6-15 08:07
.仔细看了一下您的程序,自己有几点看法:
1、首先你修改了延时程序,是否跟例程中的延时一致?
2、例程中 ...

:lol好客气,还您呢
1.官方例程中的延时为0.6us,我延时0.75us,时间应该够了
2.片选我用的是74HC138驱动,一般输出为高电平,我只要需要拉低就可以,而程序中只需要把CS拉低一次即可

使用特权

评论回复
地板
xyz549040622|  楼主 | 2013-6-16 14:16 | 只看该作者
结贴,工程师的硬件错误!

使用特权

评论回复
5
弓长月月鸟| | 2013-6-16 14:22 | 只看该作者
找到问题就行。呵呵

使用特权

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

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2727

主题

19183

帖子

103

粉丝