msp430+tsl2561问题
谁有tsl2561 c 程序啊!可以用的。有的麻烦发到我的邮箱:chenqiuhuang3@163.com谢谢! #include "include.h"
#define system_clock 16
#define SDA_1 P2OUT |= BIT4//SDA = 1
#define SDA_0 P2OUT &= ~BIT4//SDA = 0
#define SCL_1 P2OUT |= BIT3//SCL = 1
#define SCL_0 P2OUT &= ~BIT3 //SCL = 0
#define DIR_IN P2DIR &= ~BIT4 //I/O 口为输入
#define DIR_OUT P2DIR |= BIT4//SDA 输出数据
#define SDA_IN (P2IN & 0x10)//SDA 输出数据
#define TIME 5 //I2C 时序延时时间
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
unsigned int a;
unsigned char datalow,datahigh;
unsigned intADCResult;
unsigned int uiSendDataBuffer;
unsigned int uiReceiveDataBuffer;
unsigned char ack;
char paTable = {0x17,0x1c,0x26,0x57,0x60,0x85,0xc8,0xc0};//cc1100对应功率值-20,-15,-10,-5,0,5,7,10
char paTableLen = 7;
char txBuffer={0};
char rxBuffer={0};
unsigned int i;
void Delayx3u(unsigned int x);
void Delay(unsigned int x);
unsigned char ID=1; //节点号位5号;
unsigned char flag=1,data_pointer=1;
void blinkRed(void); //红灯闪函数声明;
void blinkGreen(void); //红灯闪函数声明;
void RF_send_int(unsigned char x);
void Start(void)
{
DIR_OUT;
SDA_1;
Delayx3u(2);
SCL_1;
Delayx3u(2);
SDA_0;
Delayx3u(4);
SCL_0;
Delayx3u(2);
}
void Stop(void)
{
DIR_OUT;
SDA_0;
Delayx3u(2);
SCL_1;
Delayx3u(2);
SDA_1;
Delayx3u(2);
}
/*=================================================================
//字节数据传送函数
//函数原型: void send_byte(uchar c);
//Function: 将数据C发送出去,可以是地址,也可以是数据,发完后等待回应,并对此状态
// 位进行操作(不应答或非应答都使ack=0 ),发送数据正常,ack=1;ack=0
// 表示被控器无应答或损坏。
==================================================================*/
void send_byte(unsigned char c)
{
DIR_OUT;
unsigned char bit_count;
for (bit_count=0;bit_count<8;bit_count++)
{
SCL_0;
if (((c<<bit_count)&BIT7)==1) SDA_1;
else SDA_0;
Delayx3u(4);
SCL_1;
Delayx3u(4);
}
Delayx3u(2);
SCL_0;
Delayx3u(2);
DIR_IN;
//SDA_1;
Delayx3u(2);
SCL_1;
Delayx3u(4);
if(SDA_1)
blinkRed();
else
blinkGreen();
SCL_0;
Delayx3u(2);
}
/*==================================================================
字节数据接收函数
函数原型:uchar receive_byte();
FUNCTION: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数。
===================================================================*/
unsigned char receive_byte()
{
unsigned char retc,bit_count;
retc=0;
DIR_IN;
for (bit_count=0;bit_count<8;bit_count++)
{
SCL_1;
Delayx3u(20);
retc =(retc<<1);
if(SDA_1)
{
retc = retc+1;
SDA_0;
}
else retc+= 0;
SCL_0;
SDA_0;
Delayx3u(20);
}
return (retc);
}
//写tsl2561byte
voidWriteByte(unsigned char Command1,unsigned char Data)
{
Start();
send_byte(0x52); ////SlaveAddress=0x39<<1+1
Delayx3u(50);
send_byte(Command1);
Delayx3u(50);
send_byte(Data);
Delayx3u(50);
Stop();
}
///读tsl2561byte
unsigned charReadByte(unsigned char Command3)
{
unsigned char receivedata;
Start();
send_byte(0x52); ////SlaveAddress=0x39<<1+1写命令
Delayx3u(50);
send_byte(Command3);
Delayx3u(50);
Start();
send_byte(0x53); ////SlaveAddress=0x39<<1+0读命令
Delayx3u(50);
receivedata=receive_byte();
DIR_OUT;
/*SCL_0;
SDA_0;
Delayx3u(2);
SCL_1;
Delayx3u(2);
SCL_0;*/
Stop();
Delayx3u(20);
return(receivedata);
}
/////////////////////////////////////////////////////////////////////
void Config(void) //配置tsl2561
{
WriteByte(0x81,0x01);//gain(1x),integration time of 402ms
WriteByte(0x86,0x01);//interrpt is level style, every ADC cycle generate one interrupt.
}
void start_tsl2561(void) ///开始转换
{
WriteByte(0x80,0x03);
}
void stop_tsl2561(void) //停止转换
{
WriteByte(0x80,0x00);
}
unsigned int ReadADCResult(void) //ADC结果是channel 0.
{
datalow =ReadByte(0x8C);
datahigh = ReadByte(0x8D);
ADCResult=(datahigh<<8)+datalow;
return(ADCResult);
} //--------------------------------------------------------------------------------
// 设置系统时钟
//--------------------------------------------------------------------------------
void init_clock(unsigned char clock)
{
switch(clock){
case 16:
BCSCTL1 = CALBC1_16MHZ; // Set DCO to 16MHz
DCOCTL= CALDCO_16MHZ;
break;
case 8:
BCSCTL1 = CALBC1_8MHZ; // Set DCO to 8MHz
DCOCTL= CALDCO_8MHZ;
break;
default:
BCSCTL1 = CALBC1_1MHZ; // Set DCO to 1MHz
DCOCTL= CALDCO_1MHZ;
break;
}
}
//delay 1ms
void delay_1ms(unsigned clock_set)
{
unsigned int i;
switch(clock_set){
case 16:
//system clock 16M
for(i=1;i<=2662;i++)
{
_NOP();
}
break;
case 8:
//system clock 8M
for(i=1;i<=1325;i++)
{
_NOP();
}
break;
default:
//system clock 1M
for(i=1;i<=163;i++)
{
_NOP();
}
break;
}
}
//delay 3us,可以参照delay 1ms的程序
void delay_3us(unsigned clock_set)
{
unsigned int i;
switch(clock_set){
case 16:
//system clock 16M
for(i=1;i<=8;i++)
{
_NOP();
}
break;
case 8:
//system clock 8M
for(i=1;i<=1325;i++)
{
_NOP();
}
break;
default:
//system clock 1M
for(i=1;i<=163;i++)
{
_NOP();
}
break;
}
}
//delayx3u
void Delayx3u(unsigned int x)
{
unsigned int i;
for(i=1;i<=x;i++)
{
delay_3us(system_clock);
}
}
//delay x ms
void Delay(unsigned int x)
{
unsigned int i;
for(i=1;i<=x;i++)
{
delay_1ms(system_clock);
}
}
//--------------------------------------------------------------------------------
// 设置串口,波特率可由参数设置
//--------------------------------------------------------------------------------
void init_uart(unsigned long x,unsigned char y)
{
P3SEL = 0x30; // P3.4,5 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSSEL_2; // SMCLK
//选择波特率
//SMCLK=16
if(y==16)
{
switch(x){
//SMCLK=16M
case 115200:
UCA0BR0 = 0x8A; // 16M/115200
UCA0BR1 = 0;
UCA0MCTL =0xDE;
break;
default:
// ------ 9600 baut -------------
UCA0BR0 = 0x82; // 16M/9600
UCA0BR1 = 0x06;
UCA0MCTL =0;
break;
}
}
UCA0MCTL = UCBRS0+UCBRS1; // Modulation UCBRSx = 1
UCA0CTL1 &= ~UCSWRST; // Initialize USCI state machine
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
}
void uart_send(unsigned char x)
{
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF = x;
}
void init_GDO(void)
{
TI_CC_GDO0_PxDIR &=~ TI_CC_GDO0_PIN;
TI_CC_GDO0_PxSEL &=~ TI_CC_GDO0_PIN;
TI_CC_GDO0_PxREN |= TI_CC_GDO0_PIN;
TI_CC_GDO0_PxIES |= TI_CC_GDO0_PIN; //下降沿中断
TI_CC_GDO0_PxIFG &= ~TI_CC_GDO0_PIN; //清标志位
TI_CC_GDO0_PxIE |= TI_CC_GDO0_PIN; //中断使能
}
void RF_send_int(unsigned char x)
{
if(x>=1&&x<=62)
{
//关闭了GDO0中断,input
TI_CC_GDO0_PxIE &=~TI_CC_GDO0_PIN;
while(TI_CC_GDO0_PxIN&TI_CC_GDO0_PIN); //确保CC1100发送或接收已经结束
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); // Change state to TX, initiating
//TI_CC_LED_PxOUT |=TI_CC_LED1;
txBuffer =x; // Packet length
//txBuffer = 0x01; // Packet address
//send data
RFSendPacket(txBuffer, x+2);
}
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);
TI_CC_SPIStrobe(TI_CCxxx0_SFRX);
TI_CC_SPIStrobe(TI_CCxxx0_SRX); //发送接收命令
while (TI_CC_GDO0_PxIN&TI_CC_GDO0_PIN);
// TI_CC_LED_PxOUT &=~TI_CC_LED1;
while(TI_CC_GDO0_PxIN&TI_CC_GDO0_PIN);
P2IFG &= ~TI_CC_GDO0_PIN;
TI_CC_GDO0_PxIE |=TI_CC_GDO0_PIN;
}
void init_TA1(void)
{
TA1CCTL0 = CCIE; // TA1CCR0 interrupt enabled
TA1CCR0 = 327; //10ms
TA1CTL = TASSEL_1; // ACLK, contmode
}
void blinkRed(void){
TI_CC_LED_PxOUT |=TI_CC_LED1;
Delay(100);
TI_CC_LED_PxOUT &= ~TI_CC_LED1;
}
void blinkGreen(void){
TI_CC_LED_PxOUT |=TI_CC_LED2;
Delay(100);
TI_CC_LED_PxOUT &= ~TI_CC_LED2;
}
void main (void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
init_clock(system_clock);
init_uart(9600,system_clock);
TI_CC_LED_PxDIR |=TI_CC_LED1+TI_CC_LED2;
TI_CC_LED_PxOUT &=~(TI_CC_LED1+TI_CC_LED2);
TI_CC_SPISetup(); // Initialize SPI port
TI_CC_PowerupResetCCxxxx(); // Reset CCxxxx
writeRFSettings(); // Write RF settings to config reg
//SPI验证
txBuffer= TI_CC_SPIReadReg(TI_CCxxx0_IOCFG2);//, 0x06); // GDO2 output pin config.
txBuffer= TI_CC_SPIReadReg(TI_CCxxx0_IOCFG0);//, 0x06); // GDO0 output pin config.
txBuffer= TI_CC_SPIReadReg( txBuffer= TI_CC_SPIReadReg(TI_CCxxx0_ADDR);//, 0x01); // Device address.
TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, &paTable, 1);
//配置发送功率
init_GDO();
TI_CC_SPIStrobe(TI_CCxxx0_SRX); //设置CCxxxx为接收状态
init_TA1();
_EINT();
while(1)
{
P2SEL = (BIT3+BIT4);
Config(); //配置tsl2561
start_tsl2561();///开始转换
Delay(1000);
ReadADCResult() ;//ADC结果是channel 0.
stop_tsl2561(); //停止转换
txBuffer=6;
txBuffer=1;
txBuffer=2;
txBuffer=datalow ;
txBuffer=ReadByte(0x8F);
txBuffer=ReadByte(0x8E);
txBuffer=ADCResult;
RF_send_int(txBuffer);
Delay(100);
blinkGreen();
//blinkRed();
// cxfslux();//发送串口数据
// CalculatingLux();
}
//LPM0;
}
// Timer1_A0 interrupt service routine
#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer1_A0 (void)
{
TA1CTL &= ~MC_1;
if(flag!=1)
{
data_pointer = 1; //接收数据计数清为1
flag = 1; //状态标志清为1
}
}
#pragma vector=PORT2_VECTOR
__interrupt void port2_ISR (void)
{
char len=64; // Len of pkt to be RXed (only addr
// plus data; size byte not incl b/c
// stripped away within RX function)
//TI_CC_LED_PxOUT |=TI_CC_LED1;
if (RFReceivePacket(rxBuffer,&len)) // Fetch packet from CCxxxx
{
/*
uart_send(0x55);
uart_send(len);
for(receive_counter=0;receive_counter<len;receive_counter++)
{
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF = rxBuffer;
}
*/
}
//TI_CC_LED_PxOUT &=~TI_CC_LED1;
TI_CC_SPIStrobe(TI_CCxxx0_SRX); //设置CCxxxx为接收状态
P2IFG &= ~TI_CC_GDO0_PIN;
}
//--------------------------------------------------------------------------------
//串口中断服务程序:将串口来的数据,交给RFtxBuffer[],再由RF发送出去
//串口中断服务程序:分为3个状态
//状态1:接收帧头0x55
//状态2:接收数据帧长度
//状态3:接收数据帧的有效数据
//状态用flag来标志
//--------------------------------------------------------------------------------
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
switch(flag){
case 1:
if(UCA0RXBUF == 0x7e)
{
flag = 2;
TA1CTL |=MC_1;
}
break;
case 2:
if(UCA0RXBUF>0&&UCA0RXBUF<63)
{
txBuffer = UCA0RXBUF; //接收数据帧长度给RFtxBuffer
flag = 3;
}
else
{
flag = 1;
}
break;
case 3:
txBuffer = UCA0RXBUF;
if(data_pointer == txBuffer) // 若接收完一帧数据
{
data_pointer = 1; //接收数据计数清为1
flag = 1;//状态标志清为1
TA1CTL &= ~MC_1;
TA1CTL |= TACLR;
RF_send_int(txBuffer);
}
else
{
data_pointer++; //接收数据计数变量加1
}
break;
}
} 现在读出来的是 ff ff
看看是问题出在那,硬件是1——vcc 2,3——GND 4——sck 5 ——不接 6——sda
4和6有接10k的上拉电阻。 MARK MARK
页:
[1]