Quantcast
Channel: MSP low-power microcontroller forum - Recent Threads
Viewing all articles
Browse latest Browse all 22077

CCS/MSP430FR6879: MSP430FR6879 SPI SLAVE Restarting when trying to transmit

$
0
0

Part Number:MSP430FR6879

Tool/software: Code Composer Studio

i am using msp430fr6879 as spi slave

wherein my master would be continously sending the clock pulse all the time ,

i only enable my interrupt when required to transmit or receive data .

here is my code kindly look into it ..

#include <msp430.h>
#include <string.h>
#include <math.h>
#include "SPI_SendReceive.h"
//#include "globleParam.h"
#include "structure.h"
volatile unsigned char commState;
volatile unsigned char rxCmd;

Tank_Config_struct bTankConfig;

long modbusCRCAddition(unsigned char * arr, int bSize);
char* itoah(long num, char * s, int len);
void BOS_DataParsing(void);
void FillTankConfiguration(void);
unsigned long int readNumber(unsigned char * arr, int size);
void readString(unsigned char * arr, int size, unsigned char * getArr);

volatile unsigned int rxCount=0, txCount=0;
volatile unsigned char *txPtr;
volatile unsigned char rxBuff[rxtxBuffSize], txBuff[rxtxBuffSize], tmpChar;
unsigned char rxData[rxtxBuffSize], txData[rxtxBuffSize];

void BOS_SendReceiveFunction(void)
{
    if(UCB0STATW & UCOE)
        tmpChar= UCB0RXBUF;
    if(commState==Received)
    {
        //IE2 &=~UCB0RXIE;    // Interrupt disable

        char crcData[4];
        int j;
        for(j=0; j<rxCount-6; j++)
            rxData[j]=rxBuff[j+1];
        unsigned long int crc = modbusCRCAddition(rxData, rxCount-6);
        itoah(crc, crcData, sizeof crcData + 1);

        if(crcData[0]==rxBuff[rxCount-5])
            if(crcData[1]==rxBuff[rxCount-4])
                if(crcData[2]==rxBuff[rxCount-3])
                    if(crcData[3]==rxBuff[rxCount-2])
                        commState=ReadyToProcess;
                    else
                        commState=Ideal;

        BOS_DataParsing();
    }
    else if(commState==ReadyToTransmit)
    {
        if(txCount < (rxtxBuffSize-6))
        {
            char crctxData[4];
            unsigned long int crcT = modbusCRCAddition(txData, txCount);
            itoah(crcT, crctxData, sizeof crctxData + 1);
            txBuff[0]=0x02;
            int k;
            for(k=1; k<=txCount; k++)
                txBuff[k]=txData[k-1];
            txBuff[txCount+1]=crctxData[0];
            txBuff[txCount+2]=crctxData[1];
            txBuff[txCount+3]=crctxData[2];
            txBuff[txCount+4]=crctxData[3];
            txBuff[txCount+5]=0x03;

            txCount = txCount+6;
            txPtr = txBuff;
            commState=Transmit;

            //UCB0CTLW0 &= ~UCSWRST;
             tmpChar = UCB0RXBUF;

             UCB0IE |=UCRXIE;        //Interrupt enable
         __delay_cycles(100);
        }
        else
            commState=Ideal;
    }
}

void BOS_DataParsing(void)
{
    if(commState==ReadyToProcess)
    {
        if(rxData[0]==0x30 && rxData[1]==0x31)
            rxCmd = SetTankConfig;
        else if(rxData[0]==0x30 && rxData[1]==0x32)
            rxCmd = GetStatus;
        else if(rxData[0]==0x30 && rxData[1]==0x33)
            rxCmd = GetDeliveryData;
        else if(rxData[0]==0x30 && rxData[1]==0x34)
            rxCmd = AckDelivery;
        else if(rxData[0]==0x30 && rxData[1]==0x35)
            rxCmd = ClearDelivery;
        else if(rxData[0]==0x30 && rxData[1]==0x36)
            rxCmd = SetTankCount;
        else if(rxData[0]==0x30 && rxData[1]==0x37)
            rxCmd = SetLEDStatus;
        else if(rxData[0]==0x30 && rxData[1]==0x38)
            rxCmd = SetTablePoint;
        else
            rxCmd = UnknownCommand;
    }

    if(rxCmd==UnknownCommand)
        commState=WaitForReply;
    else
    {
        if(rxCmd==SetTankConfig)
            FillTankConfiguration();
        else if(rxCmd==GetStatus)
        {
            // Fill structures;
        }
        else if(rxCmd==GetDeliveryData)
        {
            // Fill structures;;
        }
        else if(rxCmd==AckDelivery)
        {
            // Fill structures;
        }
        else if(rxCmd==ClearDelivery)
        {
            // Fill structures;
        }
        else if(rxCmd==SetTankCount)
        {
            // Fill structures;
        }
        else if(rxCmd==SetLEDStatus)
        {
            // Fill structures;
        }
        else if(rxCmd==SetTablePoint)
        {
            // Fill structures;
        }
        commState=WaitForReply;
    }
}

void FillTankConfiguration(void)
{
//    bTankConfig.TankNO = readNumber(rxData+2, 2);    //bTankConfig.TankNO = ((rxData[2]-0x30)*10 + (rxData[3]-0x30));
//    bTankConfig.probeType = readNumber(rxData+4, 1);
//    bTankConfig.ProbeAdd = readNumber(rxData+5, 5);
//    bTankConfig.Productcode = readNumber(rxData+10, 2);
//    bTankConfig.MaxTankVolume = readNumber(rxData+12, 8);
//    bTankConfig.MaxTankHeight = readNumber(rxData+20, 6);
//    bTankConfig.Probeoffset = readNumber(rxData+26, 4);
//    bTankConfig.zero_water = readNumber(rxData+30, 4);
//    bTankConfig.DeliveryDelay = readNumber(rxData+34, 4);
//    bTankConfig.ALARM_MAX_VOLUME = readNumber(rxData+38, 8);
//    bTankConfig.ALARM_PROD_HIGH = readNumber(rxData+46, 8);
//    bTankConfig.ALARM_PROD_LOW = readNumber(rxData+54, 6);
//    bTankConfig.ALARM_waterhigh = readNumber(rxData+60, 6);
//    bTankConfig.waterflaotavailable = readNumber(rxData+66, 1);
//    bTankConfig.point_count = readNumber(rxData+67, 3);
//    readString(rxData+70, 10, bTankConfig.product_name);
}

unsigned long int readNumber(unsigned char * arr, int size)
{
    unsigned long int result = 0;
    unsigned int i=0;
    for(i=0; i < size;i++)
        result += ((arr[i] - 0x30)*(pow(10,(size-i-1))));
    return result;
}

void readString(unsigned char * arr, int size, unsigned char * getArr)
{
    int i=0;
    for(i=0; i < size; i++)
    {
        getArr[i] = (arr[i]);
    }
}

long modbusCRCAddition(unsigned char * arr, int bSize)
{
        unsigned int CRCFull = 0xFFFF;
        char CRCLSB;

        int i;
        for(i=0; i < bSize; i++)
        {
            CRCFull = CRCFull ^ (int)(arr[i]);
            int j;
            for(j=0; j<8; j++)
            {
                CRCLSB = CRCFull & 0x0001;
                CRCFull = (CRCFull >> 1) & 0x7FFF;

                if(CRCLSB==1)
                    CRCFull = CRCFull ^ 0xA001;
            }
        }
        return (CRCFull);
}

char* itoah(long num, char* s, int len)
{
        long n, m = 16;
        int i = 16+2;
        int shift = 'a'- ('9'+1);

        if(!s || len < 1)
                return 0;

        n = num < 0 ? -1 : 1;
        n = n * num;

        len = len > i ? i : len;
        i = len < i ? len : i;

        s[i-1] = 0;
        i--;
        if(!num)
        {
                if(len < 2)
                        return &s[i];

                s[i-1]='0';
                return &s[i-1];
        }
        while(i && n)
        {
                s[i-1] = n % m + '0';

                if (s[i-1] > '9')
                        s[i-1] += shift ;

                n = n/m;
                i--;
        }
        if(num < 0)
        {
                if(i)
                {
                        s[i-1] = '-';
                        i--;
                }
        }
        return &s[i];
}


/** Interrupt service routine
 *
 */

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_B0_VECTOR))) USCI_B0_ISR (void)
#else
#error Compiler not supported!
#endif
{
  if(UCB0IFG&UCRXIFG)
  {
        if(commState==Ideal)
        {
            rxCount=0;
            UCB0TXBUF=0;
            if(UCB0RXBUF==0x02)
            {
                rxBuff[rxCount]=UCB0RXBUF;
                if(rxCount<99)
                rxCount++;
                commState=Receiving;
            }
            else
                rxBuff[rxCount]=UCB0RXBUF;
        }
        else if(commState==Receiving)
        {
            UCB0TXBUF=0;
            rxBuff[rxCount]=UCB0RXBUF;
            if(rxCount<99)
            rxCount++;
            if(rxBuff[rxCount-1]==0x03)
            {
                if(rxCount>6)
                {
                    commState=Received;
                    //UCB0CTLW0 |= UCSWRST;
                    UCB0IE &=~UCRXIE;
                }
                else
                    commState=Ideal;
            }
            else if(rxCount >= rxtxBuffSize)
                commState=Ideal;
        }
        else if(commState==Received | commState==ReadyToProcess)
        {
            UCB0TXBUF=0;
            tmpChar=UCB0RXBUF;
        }
        else if(commState==Transmit)
        {
            if((UCB0IFG & UCTXIFG)== UCTXIFG);
            {
             UCB0TXBUF=*txPtr;

             if(txCount>0)
             txCount--;

             if(txCount==1)
             {

             }
             if(txCount==0)
                commState=Ideal;
            }
        }
  }
}


Viewing all articles
Browse latest Browse all 22077

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>