TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430F149,SPI通行,读取温度值,单步运行好使,全速运行一直是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;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Yang Long2:

回复 jinlong zhao1:

你好,请问那如果将MSP430 SPI设置为三线模式,那么STE端口还需要设置为第二功能吗,您是怎么处理这个的,我的理解是将其悬空,不知道对不对?按您的程序,ADT芯片的片选信号用普通I/O端口连接即可,是这样吗?

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F149,SPI通行,读取温度值,单步运行好使,全速运行一直是0,不知道为什么,麻烦看一看
分享到: 更多 (0)