chenqiuhuang3 发表于 2011-5-31 22:00:18

msp430+tsl2561问题

谁有tsl2561 c 程序啊!可以用的。有的麻烦发到我的邮箱:chenqiuhuang3@163.com
谢谢!

chenqiuhuang3 发表于 2011-5-31 22:01:04

#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);
}

chenqiuhuang3 发表于 2011-5-31 22:02:05

//--------------------------------------------------------------------------------
// 设置系统时钟
//--------------------------------------------------------------------------------

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(

chenqiuhuang3 发表于 2011-5-31 22:03:08

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;
}
}

chenqiuhuang3 发表于 2011-5-31 22:05:54

现在读出来的是 ff ff
看看是问题出在那,硬件是1——vcc 2,3——GND 4——sck 5 ——不接 6——sda
4和6有接10k的上拉电阻。

wanyou132 发表于 2011-7-6 12:47:04

MARK

sunicecream 发表于 2011-9-15 17:22:19

MARK
页: [1]
查看完整版本: msp430+tsl2561问题