搜索
bottom↓
回复: 5

求助各位,AVR SPI接口读MAX6675结果不对的问题

[复制链接]

出0入0汤圆

发表于 2014-5-5 17:18:51 | 显示全部楼层 |阅读模式
各位 打扰大家了  由于要用到热电偶进行温度控制 ,因此选了MAX6675,用AVR 的SPI口进行读MAX6675 发现读回来的数据不对,麻烦大家帮我看下是SPI接口哪个环节设置错误了 谢谢  排查了两天了都没看出来~~ 下面是我的程序:

include<avr/io.h>
#include<avr/interrupt.h>//如果要用到外部中断,必须包含此头文件
void Init_SPI(void);
void init_USART(void);

//常量定义
#define BAUDRATE                9600        //波特率
#define F_CPU                                8000000 //这个已经在makefile里面定义了

unsigned char temperature,send_temp_ok=0;
void delay(void);
volatile unsigned char hbytedata,lbytedata;
unsigned int Read_Max6675(unsigned char c);

int main(void)
{

init_USART();
Init_SPI();
while(1)
{   
    temperature=Read_Max6675(0x00);
        if(send_temp_ok)
        {
        while ( !( UCSRA & (1<<UDRE)) )//在载入新的要发送的数据前,通过检测UDRE 标志等待发送缓冲器为空。该位在发送缓冲器空时被置"1” ;当发送缓冲器包含需要发送的数据时清零。
    ;
    UDR = temperature;/* 确认UDR空时,将数据放入缓冲器,然后将接收到的数据i发送回PC机子 */
//    while ( !( UCSRA & (1<<UDRE)) )//在载入新的要发送的数据前,通过检测UDRE 标志等待发送缓冲器为空。该位在发送缓冲器空时被置"1” ;当发送缓冲器包含需要发送的数据时清零。
//   ;
//    UDR = lbytedata;/* 确认UDR空时,将数据放入缓冲器,然后将接收到的数据i发送回PC机子 */
        send_temp_ok=0;
        }
}
}


void Init_SPI(void)
{
DDRB|=((1<<4)|(1<<5)|(1<<7));//PB4设置为输出,对应SPI的SS,PB5设置为输出,对应SPI的MOSI,PB7设置为输出,对应SPI的SCK
DDRB&=~(1<<6);//PB6设置为输入,对应SPI的MISO
PORTB|=(1<<6);//为PB6配置上拉电阻
SPCR|=((1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<SPR0));//使能SPI 中断,SPE 置位将使能SPI,MSTR置位时选择主机模式,下降沿为起始沿
SPCR&=~(1<<CPHA);//下降沿时主机、从机均采样数据,上升沿移位
SPSR|=(1<<SPI2X);//SPI速率为系统时钟8分频,即1M
SPCR&=~(1<<DORD);//DORD清零,数据的MSB 首先发送
}

void init_USART(void)//USART 初始化
{
//第一步:设置波特率
    //U2X=0时的公式计算
    UBRRL= (F_CPU/BAUDRATE/16-1)%256;
    UBRRH= (F_CPU/BAUDRATE/16-1)/256;
//第二步:使能发送、接收、接收完成中断:
//置位UCSRB 的接收结束中断使能位(RXCIE) 后,只要RXC 标志置位( 且全局中断使能
//) 就会产生USART 接收结束中断。使用中断方式进行数据接收时,数据接收结束中断服
//务程序程序必须从UDR 读取数据以清RXC 标志,否则只要中断处理程序一结束,一个
//新的中断就会产生。接收结束标志(RXC) 用来说明接收缓冲器中是否有未读出的数据。
    UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);//置位UCSRB 寄存器的发送允许位TXEN 将使能USART 的数据发送,置位UCSRB 寄存器的接收允许位(RXEN) 即可启动USART 接收器。
//第三步:
SREG|=(1<<7);//开总中断
}

unsigned int Read_Max6675(unsigned char c)
{
unsigned int temp=0x0000;

PORTB|=(1<<4);//启动一次转换处理过程
delay();//等待转换完成,大概需要0.2S左右
PORTB&=~(1<<4);//转换结束,将CS拉低停止转换处理
SPDR=c;//启动SPI,写的同时进行读取
while((SPSR&(1<<SPIF))==0);//SPI还没传输完成 等待
hbytedata=SPDR;//将数据的高8位保存起来
SPDR=c;//启动SPI,写的同时进行读取
while((SPSR&(1<<SPIF))==0);//SPI还没传输完成 等待
lbytedata=SPDR;//将数据的低8位保存起来
temp|=(hbytedata<<8);
temp|=lbytedata;
temp<<=1;
temp>>=4;
send_temp_ok=1;
return temp;
}

void delay(void)
{
unsigned int t1,t2;
for(t1=0;t1<550;t1++)
for(t2=0;t2<250;t2++)
asm("nop");
}


AVR也是刚学 所以如有什么不妥 请见谅~

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

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

出0入0汤圆

 楼主| 发表于 2014-5-5 17:21:06 | 显示全部楼层
自己顶一下先  MAX6675看数据手册是下降沿的时候读取数据的吧??   我AVR中将SPI口设置为前沿是下降沿,然后下降沿读取数据,后一个沿即上升沿将MAX6675进行移位  不知道对不?

出0入0汤圆

发表于 2014-5-5 17:28:53 | 显示全部楼层
手头有示波器吗?看一下。

读不出数,多数是时序的事情。

temperature=Read_Max6675(0x00);

上边的0x00是寄存器地址吗?检查一下。

temp<<=1;
temp>>=4;

这是在干什么???
确认一下。

你要在线调一下,应该搞得定的。

出0入0汤圆

 楼主| 发表于 2014-5-6 08:10:54 | 显示全部楼层
首先感谢3楼的回复  估计3楼没自己看函数体吧  0x00是随便写的一个数,AVR 的SPI 写进去的同时是对从机进行读的  而MAX6675只是一个传感器带AD的 只需读就可以了  所以我随便写了一个数以启动AVR 的SPI读。   
请各位有用过AVR SPI的 帮忙一下吧  顺带附上MAX6675的时序

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-5-6 08:11:57 | 显示全部楼层
本帖最后由 tangcangeng 于 2014-5-6 08:21 编辑
sy_lixiang 发表于 2014-5-5 17:28
手头有示波器吗?看一下。

读不出数,多数是时序的事情。


首先感谢3楼的回复  估计3楼没自己看函数体吧  0x00是随便写的一个数,AVR 的SPI 写进去的同时是对从机进行读的  而MAX6675只是一个传感器带AD的 只需读就可以了  所以我随便写了一个数以启动AVR 的SPI读。   
请各位有用过AVR SPI的 帮忙一下吧  顺带附上MAX6675的时序,因为MAX6675一次读过来的温度数据是16位的而最高位15 以及低3位都是跟温度无关的, 所以左移1位去掉最高位  右移4位去掉最低3位以及由最先的左移1位的补零,剩下的3-14位就是有效位了


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-5-12 16:55:32 | 显示全部楼层
谢谢各位 已经解决了  AVR 的SPI接口还是很好用的 只是比较难懂
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-26 12:22

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

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