搜索
bottom↓
回复: 6
打印 上一主题 下一主题

msp430+tsl2561问题

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2011-5-31 22:00:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
谁有tsl2561 c 程序啊!可以用的。有的麻烦发到我的邮箱:chenqiuhuang3@163.com
谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

2
 楼主| 发表于 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[50];
unsigned char datalow,datahigh;
unsigned int  ADCResult;
unsigned int uiSendDataBuffer[8];
unsigned int uiReceiveDataBuffer[8];  

unsigned char ack;
char paTable[8] = {0x17,0x1c,0x26,0x57,0x60,0x85,0xc8,0xc0};//cc1100对应功率值-20,-15,-10,-5,0,5,7,10
char paTableLen = 7;  
char txBuffer[64]={0};
char rxBuffer[63]={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);
}

//写tsl2561  byte
void  WriteByte(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();
}

///读tsl2561  byte
unsigned char  ReadByte(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);
}

出0入0汤圆

3
 楼主| 发表于 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[0] =x;                          // Packet length
    //txBuffer[1] = 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[63]= TI_CC_SPIReadReg(TI_CCxxx0_IOCFG2);//,   0x06); // GDO2 output pin config.
    txBuffer[63]= TI_CC_SPIReadReg(TI_CCxxx0_IOCFG0);//,   0x06); // GDO0 output pin config.   
    txBuffer[63]= TI_CC_SPIReadReg(

出0入0汤圆

4
 楼主| 发表于 2011-5-31 22:03:08 | 只看该作者
txBuffer[63]= TI_CC_SPIReadReg(TI_CCxxx0_ADDR);//,     0x01); // Device address.   
            
    TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, &paTable[paTableLen], 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[0]=6;
      txBuffer[1]=1;
      txBuffer[2]=2;
      txBuffer[3]=datalow ;
      txBuffer[4]=ReadByte(0x8F);
      txBuffer[5]=ReadByte(0x8E);
      txBuffer[6]=ADCResult;
     RF_send_int(txBuffer[0]);
     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[receive_counter];
        }
     */
  }
  //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[0] = UCA0RXBUF;    //接收数据帧长度给RFtxBuffer[0]

    flag = 3;
    }
    else
    {
      flag = 1;
    }
    break;
   
  case 3:
    txBuffer[data_pointer] = UCA0RXBUF;  
    if(data_pointer == txBuffer[0]) // 若接收完一帧数据
    {
      data_pointer = 1;     //接收数据计数清为1
      flag = 1;  //状态标志清为1
      TA1CTL &= ~MC_1;
      TA1CTL |= TACLR;
      RF_send_int(txBuffer[0]);
    }
    else
    {
       data_pointer++;   //接收数据计数变量加1
    }
    break;
  }
}

出0入0汤圆

5
 楼主| 发表于 2011-5-31 22:05:54 | 只看该作者
现在读出来的是 ff ff
看看是问题出在那,硬件是1——vcc 2,3——GND 4——sck 5 ——不接 6——sda
4和6有接10k的上拉电阻。

出0入0汤圆

6
发表于 2011-7-6 12:47:04 | 只看该作者
MARK

出0入0汤圆

7
发表于 2011-9-15 17:22:19 | 只看该作者
MARK
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 01:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表