/***************************************************************************
 * EM430F6137FR900 + CMR3000 + SCA3100 viestien vastaanotto.
 * Tämä puoli hoitaa viestien vastaanoton toiselta laudalta, jossa on
 * kiinni CMR3100 ja SCA3100 anturit. Muodostetaan yhteys kahden
 * EM430F6137FR900 kehityslaudan välille. Kun linkki on muodostettu,
 * syttyy laudassa vihreä ledi. Ohjelma jää odottamaan uuden viestin
 * saapumista toiselta laudalta. Aina kun uusi viesti saapuu, laitetaan
 * punainen ledi päälle. Kun viesti on käsitelty ja lähetetty eteenpäin
 * sarjaväylälle, sammutetaan punainen ledi. Arvot lähetetään sarjaväylälle
 * 8 bittisenä tavuna. Sarjaväylälle lähtee yhteensä 14 tavua. 12 tavua arvoja
 * ja 2 tarkistus tavua lopussa, jotta Qt tietää mistä kohtaa lukea arvoja.
 *
 *
 *   Sarjaväylän siirtonopeus = 9600
 *
 *                 CC430F6137
 *             -----------------
 *         /|\|                 |
 *          | |                 |
 *          --|RST              |
 *            |                 |
 *            |     P2.7/UCA0TXD|------------>
 *            |                 | 9600 - 8N1
 *            |     P2.6/UCA0RXD|<------------
 *
 * */

#include "bsp.h"
#include "mrfi.h"
#include "nwk_types.h"
#include "nwk_api.h"
#include "bsp_leds.h"
#include "bsp_buttons.h"
#include "math.h"
//#include "app_remap_led.h"

static void linkFrom(void);

void toggleLED(uint8_t);

static          linkID_t sLinkID2 = 0;
static volatile uint8_t  sSemaphore = 0;
unsigned short realValues(unsigned short values);
void wait_ms(unsigned short ms);
void wait_us(unsigned short us);
void Serial_TX(unsigned int value);
void Init();
#define XTAL 16000000L
#define TICKSPERMS (XTAL / 1000 / 5 - 1)
#define TICKSPERUS (TICKSPERMS / 1000)
#define SPICLOCK 500 // SPI clock = 500kHz
#define SPIFRAMEDELAY ((1000 / SPICLOCK) * 6) // SPI interframe delay [us] = 6 * Tsck
#define SPICSBDELAY ((1000 / SPICLOCK) / 2) // SCK -> CSB delay [us] = 0.5 * Tsck
static uint8_t sRxCallback(linkID_t);

unsigned char ReadRX();
#define TX_BUFFER UCA0TXBUF
#define RX_BUFFER UCA0RXBUF
unsigned short mode;
unsigned short check1;
unsigned short check2;
unsigned short CMR3000_SCA3100 = 0x31;
unsigned short CMR3000 = 0x32;
unsigned short SCA3100 = 0x33;
uint8_t  msg[1];
char tx_CMR3000_x_msb_value;
char tx_CMR3000_x_lsb_value;
char tx_CMR3000_y_msb_value;
char tx_CMR3000_y_lsb_value;
char tx_CMR3000_z_msb_value;
char tx_CMR3000_z_lsb_value;
char tx_SCA3100_x_msb_value;
char tx_SCA3100_x_lsb_value;
char tx_SCA3100_y_msb_value;
char tx_SCA3100_y_lsb_value;
char tx_SCA3100_z_msb_value;
char tx_SCA3100_z_lsb_value;

void main (void)
{
  BSP_Init();                                 // Laudan alustus
  SMPL_Init(sRxCallback);                     // Radion ja SimpliTi alustus
  Init();
  while(1)
  {
  mode = ReadRX();
  wait_ms(2);
  check1 = ReadRX();
  wait_ms(2);
  check2 = ReadRX();
  msg[0] = mode;
  break;
  }   
  linkFrom();                                 // Linkin muodostaminen
      
    while (1) ;
}
// Muodostetaan linkki "lähettäjä" laitteen kanssa, kun linkki on muodostettu laitetaan vihreä ledi päälle. 
static void linkFrom()
{

// Jäädään odottamaan, että linkki on muodostettu
  while (1)
  {    
    if (SMPL_SUCCESS == SMPL_LinkListen(&sLinkID2))
    {
      BSP_TURN_ON_LED1();                     // Kun linkki on muodostettu laitetaan vihreä ledi päälle
      break;
    }
  }   
   SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_RXON, 0); // radion käynnistys
       SMPL_Send(sLinkID2, msg, sizeof(msg));                         // läheteetään arvot toiselle laudalle radion kautta
   while (1)
   {
    // Odotetaan että viesti saapuu. vastaanotto säie antaa interruptin
    
    }
}

// Saapuvan viestin käsittely. Kun uusi viesti on vastaanotettu,
// laitetaan punainen ledi päälle. Kun viesti on lähetetty
// eteenpäin sarjaväylälle, laitetaan punainen ledi pois päältä

static uint8_t sRxCallback(linkID_t port)
{
    if (port == sLinkID2)
          {
        if(mode == CMR3000_SCA3100)
        {
        uint8_t msg[12], len;
                // Tarkistetaan että viesti tulee halutusta laitteesta
          
                // Otetaan saapuva viesti vastaan
             if ((SMPL_SUCCESS == SMPL_Receive(sLinkID2, msg, &len)) && len)
             {     
                 if(mode == CMR3000_SCA3100)
                 {   
        // Luetaan saapuvat viestit        
                       BSP_TURN_ON_LED2();
                    tx_SCA3100_x_msb_value = msg[0];
                    tx_SCA3100_x_lsb_value = msg[1];
                    tx_SCA3100_y_msb_value = msg[2];
                    tx_SCA3100_y_lsb_value = msg[3];
                    tx_SCA3100_z_msb_value = msg[4];
                    tx_SCA3100_z_lsb_value = msg[5];
                    tx_CMR3000_x_msb_value = msg[6];
                    tx_CMR3000_x_lsb_value = msg[7];
                    tx_CMR3000_y_msb_value = msg[8];
                    tx_CMR3000_y_lsb_value = msg[9];
                    tx_CMR3000_z_msb_value = msg[10];
                    tx_CMR3000_z_lsb_value = msg[11];
        
                      // Lähetetään viestit sarjaväylälle
                       Serial_TX(tx_CMR3000_x_msb_value);
                       Serial_TX(tx_CMR3000_x_lsb_value);
                       Serial_TX(tx_CMR3000_y_msb_value);
                       Serial_TX(tx_CMR3000_y_lsb_value);
                       Serial_TX(tx_CMR3000_z_msb_value);
                       Serial_TX(tx_CMR3000_z_lsb_value);
                       Serial_TX(tx_SCA3100_x_msb_value);
                       Serial_TX(tx_SCA3100_x_lsb_value);
                       Serial_TX(tx_SCA3100_y_msb_value);
                       Serial_TX(tx_SCA3100_y_lsb_value);
                       Serial_TX(tx_SCA3100_z_msb_value);
                       Serial_TX(tx_SCA3100_z_lsb_value);
       
                 }
            }
        }
                if(mode == CMR3000 || mode == SCA3100)
                {
                      uint8_t msg[6], len;
                            // Tarkistetaan että viesti tulee halutusta laitteesta
                      
                            // Otetaan saapuva viesti vastaan
                         if ((SMPL_SUCCESS == SMPL_Receive(sLinkID2, msg, &len)) && len)
                         {     
                             if(mode == CMR3000)
                             {   
                                // Luetaan saapuvat viestit        
                                   BSP_TURN_ON_LED2();
                                tx_CMR3000_x_msb_value = msg[0];
                                tx_CMR3000_x_lsb_value = msg[1];
                                tx_CMR3000_y_msb_value = msg[2];
                                tx_CMR3000_y_lsb_value = msg[3];
                                tx_CMR3000_z_msb_value = msg[4];
                                tx_CMR3000_z_lsb_value = msg[5];
                                
                                  // Lähetetään viestit sarjaväylälle
                                   Serial_TX(tx_CMR3000_x_msb_value);
                                   Serial_TX(tx_CMR3000_x_lsb_value);
                                  Serial_TX(tx_CMR3000_y_msb_value);
                                   Serial_TX(tx_CMR3000_y_lsb_value);
                                   Serial_TX(tx_CMR3000_z_msb_value);
                                   Serial_TX(tx_CMR3000_z_lsb_value);
                             }
                             if(mode == SCA3100)
                             {   
                                // Luetaan saapuvat viestit        
                                   BSP_TURN_ON_LED2();
                                tx_SCA3100_x_msb_value = msg[0];
                                tx_SCA3100_x_lsb_value = msg[1];
                                tx_SCA3100_y_msb_value = msg[2];
                                tx_SCA3100_y_lsb_value = msg[3];
                                tx_SCA3100_z_msb_value = msg[4];
                                tx_SCA3100_z_lsb_value = msg[5];
                               
                                  // Lähetetään viestit sarjaväylälle
                                   Serial_TX(tx_SCA3100_x_msb_value);
                                   Serial_TX(tx_SCA3100_x_lsb_value);
                                   Serial_TX(tx_SCA3100_y_msb_value);
                                   Serial_TX(tx_SCA3100_y_lsb_value);
                                   Serial_TX(tx_SCA3100_z_msb_value);
                                   Serial_TX(tx_SCA3100_z_lsb_value);              
                             }
                   
                         }
                }
            


         // Qt. tehdylle ohjelmalle tarkistus bitit
       Serial_TX(check1);
       Serial_TX(check2);
       BSP_TURN_OFF_LED2();
       wait_ms(10);
    
       return 1;
     }

  return 0;
}
// Wait ms
void wait_ms(unsigned short ms)
{
 unsigned short a, b;
 for (a = ms; a > 0; a--) // outer loop takes 5 ck per round
 for (b = TICKSPERMS; b > 0; b--) // inner loop takes 5 ck per round
 asm(" nop");
}
// Wait us
void wait_us(unsigned short us)
{
 unsigned short a;
 us *= TICKSPERUS;
 for (a = us; a > 0; a--) // loop takes 5 ck per round
 asm(" nop");
}

// Sarjaporttiin lähetys
void Serial_TX(unsigned int value)
{
_delay_cycles(12000);                 // lisätään pieni väli lähetyksien välille
       UCA0TXBUF = value;                  // byten lähetys
}

void Init()
{
WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer
 
  P5SEL |= 0x03;                            // Enable XT1 pins
 
  do
  {
    UCSCTL7 &= ~(XT1LFOFFG + DCOFFG);
                                            // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
    __delay_cycles(100000);                 // Delay for Osc to stabilize
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

  P1OUT = 0x000;                            // P1.0/1 setup for LED output
  P1DIR |= BIT0+BIT1;                       //

  PMAPPWD = 0x02D52;                        // Get write-access to port mapping regs  
  P1MAP5 = PM_UCA0RXD;                      // Map UCA0RXD output to P2.6
  P1MAP6 = PM_UCA0TXD;                      // Map UCA0TXD output to P2.7
  PMAPPWD = 0;                              // Lock port mapping registers
 
  P1DIR |= BIT6;                            // Set P2.7 as TX output
  P1SEL |= BIT5 + BIT6;                     // Select P2.6 & P2.7 to UART function

  UCA0CTL1 |= UCSWRST;                      // **Put state machine in reset**
  UCA0CTL1 |= UCSSEL_1;                     // CLK = ACLK
  UCA0BR0 = 0x03;                           // 32k/9600 - 3.41
  UCA0BR1 = 0x00;                           //
  UCA0MCTL = 0x06;                          // Modulation
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
}
unsigned char ReadRX()  
{
    unsigned char Result;
    Result = RX_BUFFER;                         // pyyhitään interrupt lippu lukemalla RX bufferi    
    while (!(UCA0IFG&UCRXIFG));                 // odotetaan että uusi tieto on kirjoitettu RX bufferiin
    Result = RX_BUFFER;                         // luetaan RX bufferi
    wait_us(SPICSBDELAY);                     
    wait_us(SPIFRAMEDELAY);             
    return Result;                                 // palautetaan RX bufferista saatu data
}
  • No labels
You must log in to comment.