搜索
bottom↓
回复: 2

mega16与12位ADC的SPI通信问题请教

[复制链接]

出0入0汤圆

发表于 2010-7-25 10:38:28 | 显示全部楼层 |阅读模式
俺是初学C初学AVR,现在遇到个问题想各位大侠请教:
mega16和12位ADC芯片mcp3204进行SPI通信的时候一直失败,请帮忙看一下程序:
unsigned char Get_mcp3204_val(void)
{
        unsigned int i;
        unsigned char m;
        float j;
        i = mcp3204_SPI();
        j = (i*5)/4096;
        //以下是取转换结果整数部分已验证是否通信成功
        m = (unsigned char)j;
        return(m);
}

unsigned int mcp3204_SPI(void)
{
        static unsigned int temp,temp1;
        DDRB =(1<<PB7)|(~(1<<PB6))|(1<<PB5)|(1<<PB4);
        PORTB = (1<<PB7)|(1<<PB6)|(1<<PB5)|(1<<PB4);
        SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0);//
        PORTB &=(~(1<<PB4));//启动通信
//    delay(1000);
        SPSR = 0x00;
        SPDR = 0x07;//发送起始位和SGL,D2位
        //temp = SPDR;
        while(!SPSR&(1<<SPIF));
//        SPSR = 0x00;
        temp = SPDR;
//        while(!SPSR&(1<<SPIF));
        SPSR = 0x00;
        SPDR = 0x3f;//发送D1D0
        while(!SPSR&(1<<SPIF));
//        SPSR = 0x00;
        temp = SPDR;//接受高四位
//        while(!SPSR&(1<<SPIF));
        SPSR = 0x00;
        SPDR = 0xff;
        while(!SPSR&(1<<SPIF));
//        SPSR = 0x00;
        temp1 = SPDR;//接受低8位
//        while(!SPSR&(1<<SPIF));
        PORTB &=(1<<PB4);
        temp = (unsigned int)temp<<8;
        temp = (unsigned int)((temp|temp1)&0x0fff);
        return(temp);

}
mcp的资料:
mcp3204配置位 (原文件名:未命名.jpg)

SPI时序图ourdev_570551.jpg(文件大小:1.23M,只有400K以内的图片才能直接显示) (原文件名:未命名1.jpg)
mcp3204datasheetourdev_570552.pdf(文件大小:1.44M) (原文件名:mcp3204.pdf)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2010-7-25 10:40:04 | 显示全部楼层
回复【楼主位】flyto
-----------------------------------------------------------------------
软件模拟的,也不行
#include<avr/io.h>
#include"delay.h"
#include"display.h"
#define        CS PB4
#define DO PB6
#define DI PB5
#define        CLK PB7
unsigned int SPI_mcp3204(void);
int main(void)
{
        while(1)
        {
                unsigned char temp;
                unsigned int m,n;
                m = SPI_mcp3204();
                n = (m*5)/4096;
                temp = (unsigned char)n;
                display(temp);
        }
}

unsigned int SPI_mcp3204(void)
{
        unsigned char j;
        unsigned int i = 0;
        DDRB = 0xbf;
        PORTB = 0xff;
        //发送启动位和SGL,D2,D1,D0
        PORTB &=(~(1 << CS));
        PORTB &=(~(1 << CLK));
        PORTB &= (1<< DI);//1
        PORTB &=(1 << CLK);
        asm("nop");
   // delay(10000);
        PORTB &=(~(1 << CLK));
        PORTB &= (1<< DI);//1
        PORTB &=(1 << CLK);
        asm("nop");
        //delay(10000);
        PORTB &=(~(1 << CLK));
        PORTB &=(~(1 << DI));//0
        PORTB &=(1 << CLK);
        asm("nop");
        //delay(10000);
        PORTB &=(~(1 << CLK));
        PORTB &=(~(1 << DI));//0
        asm("nop");
//        delay(10000);
        PORTB &=(1 << CLK);
        //采样周期
        asm("nop");
        //        delay(10000);
        PORTB &=(~(1 << CLK));
        asm("nop");
        //        delay(10000);
        PORTB &=(1 << CLK);
        //空位
        asm("nop");
        //        delay(10000);
        PORTB &=(~(1 << CLK));
        asm("nop");
                //delay(10000);
        PORTB &=(1 << CLK);
        //读取转换结果
        for(j =12;j > 0; j--)
        {
                asm("nop");
                //        delay(10000);
                PORTB &=(~(1 << CLK));
                asm("nop");
                //        delay(10000);
                i = ((PINB&0x40) >> PB6);
                i <<=1;
                PORTB &=(1 << CLK);
        }
        PORTB &= (1 << CS);//拉高片选
        i >>= 1;
        return(i);       
}

出0入0汤圆

发表于 2013-5-24 14:28:33 | 显示全部楼层
flyto 发表于 2010-7-25 10:40
回复【楼主位】flyto
-----------------------------------------------------------------------
软件模 ...

你好,不知道你的这个问题解决了吗?我现在也要做这个,能不能提供一下你的程序让我参考一下!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 23:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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