-
Created by Unknown User (tonini), last modified on 10.7.2012
/***************************************************************************
* 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
}
You must log in to comment.