菜鸟求助:MSP430F149,SPI ,读ADT7320温度值,单步运行可以读取数值,可是全速运行是读取的全是0,求大神指点迷津,下面是小弟完整程序。
//ADT7320测温(SPI测试版)
#include<MSP430x14x.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#define con
tinous_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;
}
一周热门 更多>