微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 430F149,SPI ,单步可以读数,全速读出来0

430F149,SPI ,单步可以读数,全速读出来0

时间:10-02 整理:3721RD 点击:
菜鸟求助:MSP430F149,SPI ,读ADT7320温度值,单步运行可以读取数值,可是全速运行是读取的全是0,求大神指点迷津,下面是小弟完整程序。
//ADT7320测温(SPI测试版)
#include<MSP430x14x.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

#define continous_16 0x54  //连续读取16位
#define wr_config    0x08   //写控制寄存器命令
#define one_shot     0x20     //读数模式
typedef unsigned char uchar;
typedef unsigned int uint;

/*SPI初始化函数*/
void spiinitad(void)
{
UCTL1 |= SWRST;
UCTL1 |= CHAR + SYNC + MM;                       //SPI主模式,8为数据
UTCTL1 |= STC + SSEL0 + CKPL;             //选定ACLK(32KHZ晶振)为时钟源,3线SPI模式 (CKPH,CKPL)=10
U1BR0 = 0x02;                        
U1BR1 = 0x00;                                   //波特率分频因子为2
UMCTL1 = 0x00;                                  //SPI模式下必须置零
ME2 |= USPIE1;                                   //SPI0模块允许
UCTL1 &= ~SWRST;                                //SWRST复位,USART允许
P5SEL = 0x0F;                                  //P5.0~P5.3为SPI模块功能
P5DIR = 0x0A;                                 出模式;P3.2(SOMI)为输入模式
P4SEL = 0x00;                                  //P4为端口模式
P4DIR = 0x40;                                  //P4.6输出(作为片选信号)
P4OUT = 0x40;
}
/*TX0结束判断函数*/
void tx1over(void)
{
while((UTCTL1 & 0x01)!= 0x01)
  {;}                                            //如果发送中断标志位为1,跳出
}

/*延时函数*/
void Delay(uint time)
{
uint i;
for(i=0;i<time;i++)
  {
   ;
  }
}
/*SPI数据发送函数*/
int send(int data)
{
int transdata=0,receivedata=0;
transdata = data;
P4OUT &= ~0x40;                                 //CS=0
Delay(10);
TXBUF1 = transdata;
tx1over();
receivedata = RXBUF1;
Delay(10);
P4OUT |= 0X40;                                  //CS=1
return receivedata;
}

void reset(void);
void shot(void);
int rd(void);
int TEMP;
float T;
/***********************************
函数名称:main
功    能: 主函数
参    数:无
返回值  :无
************************************/
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;           //关看门狗
  while(1)
  {
    spiinitad();              //SPI初始化
    reset();                    //复位
    shot();                     //读数模式设置
    TEMP=rd();           //读数
    T=TEMP/128.0;    //计算温度值
  }
}

//复位
void reset(void)           //复位,连续写32个1,延时500us
{   
  int i=0;
  P4OUT&=~0X40  ;// pull CSB low to start the command
  Delay(10);
  for(i=0;i<5;i++)
  {
    send(0xff); // send reset sequence
  }
  Delay(500);        // wait for the reset sequence timing
  P4OUT=0X40;          // pull CSB high to finish the command
}
void shot(void)           //读数模式设置,延时240us
{
  P4OUT&=~0X40  ;
  send(0x08);
  send(0x80+0x20);
  Delay(240);
  P4OUT=0X40;
}
int rd(void)          //读数子函数
{
  int ret=0,tp=0;   
  P4OUT&=~0X40  ;       //CS=0
  send(continous_16);      //发送读数命令
   Delay(10);                 
  ret=send(0x00);            //读取第一个字节
  Delay(10);
  tp=tp+256*ret;              //左移8位
  ret=send(0x00);            //读取第二个字节
   Delay(10);
  tp=tp+ret;
  P4OUT=0X40;
  return tp;
}


延时有问题,初步估计你的延时时间太短了,建议延时加长看看

谢谢,是延时问题,现在解决了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top