久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2362|回復: 0
打印 上一主題 下一主題
收起左側

28035串口助手調試返回的數值不對,是反的,是什么問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:421544 發表于 2018-12-18 15:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
[發送]00 01 02 03  [接收]FF FD FB FB [發送]1A B2 3C D4 E5 F6 7B 8D [接收]DB BB BF D7 F5 F7 7B ED [發送]01 02 03 04 05 06 07 08 [接收]FD FB FB F7 F5 F7 F7 EF
大概是這樣的情況。
下面是我的程序,用的是lin做sci,modbus,改了很久,每次結果都是一樣的。
void main(void)
{
        InitSysCtrl();
        InitLinaGpio();
        InitPieCtrl();
        InitPieVectTable();
        EALLOW;
        PieVectTable.TINT0=&cpu_time0_isr;
        EDIS;
        InitCpuTimers();
        ConfigCpuTimer(&CpuTimer0,63,1000);
        PieCtrlRegs.PIEIER1.bit.INTx7=1;
        IER=1;
        EALLOW;
        PieVectTable.LIN0INTA=&LIN0INTA_ISR;
        PieVectTable.LIN1INTA=&LIN1INTA_ISR;
        EDIS;
        PieCtrlRegs.PIEIER9.bit.INTx4=1;
        PieCtrlRegs.PIEIER9.bit.INTx3=1;
        IER|=0x100;
        EINT;
        ERTM;
        SetupSCI();
        ConfigureModbus();
        while(1)
        {
                if((CpuTimer0.InterruptCount>7)&&(ModbusModule.Status==0x01))
                {       
                        ModbusModule.Status=RECE_END;
                        CpuTimer0.InterruptCount=0;
                        RTUSlaveFrameAnalyse();
                        ModbusModuleRTUSlaveRun();
                }
        }
}



void ConfigureModbus(void)
{
        int i;
        for(i=0;i<256;i++)
        {
                ModbusModule.Buf[i]=0;
        }
        ModbusModule.Txlen=0x0;
        ModbusModule.Rxlen=0x0;
        ModbusModule.Point=0x0;
        ModbusModule.ID=0x1;
        ModbusModule.FunCode=0;
        ModbusModule.Status=SEND_END;
}
interrupt void LIN0INTA_ISR(void)
{
        int i;
        if(ModbusModule.Txlen!=0)
        {
                if(ModbusModule.Txlen>16)
                {
                        for(i=0;i<16;i++)
                        {
                                LinaRegs.SCITD=ModbusModule.Buf[ModbusModule.Point++];
                        }
                        ModbusModule.Txlen-=16;
                        ModbusModule.Status=SEND_START;
                }
                else
                        for(i=0;i<ModbusModule.Txlen;i++)
                        {
                                LinaRegs.SCITD=ModbusModule.Buf[ModbusModule.Point++];
                        }
                        ModbusModule.Txlen=0;
        }
        else
        {
                ModbusModule.Status=SEND_END;
                LinaRegs.SCIGCR1.bit.RXENA = 1;                 //Enable RX
                LinaRegs.SCIGCR1.bit.TXENA = 0;                 //Disable TX
                ConfigureModbus();
        }
        //*SciaRegs.SCIFFTX.bit.TXINTCLR=1;*/
        PieCtrlRegs.PIEACK.bit.ACK9=1;
}
interrupt void LIN1INTA_ISR(void)
{
        Uint16 temp;
        CpuTimer0Regs.TCR.bit.TSS=1;
        CpuTimer0Regs.TCR.bit.TRB=1;
        CpuTimer0Regs.TCR.bit.TSS=0;
        temp=LinaRegs.SCIRD.all;
        temp&=0xff;
        switch(ModbusModule.Status)
        {
                case 0x00:
                        ModbusModule.Status=RECE_START;
                        ModbusModule.Buf[ModbusModule.Point++]=temp;
                        ModbusModule.Rxlen=ModbusModule.Point;
                        break;               
                case 0x01:
                        if(CpuTimer0.InterruptCount<3)       
                        {
                                ModbusModule.Buf[ModbusModule.Point++]=temp;
                                ModbusModule.Rxlen=ModbusModule.Point;
                        }
                        if(CpuTimer0.InterruptCount<=7&&CpuTimer0.InterruptCount>3)
                        {       
                                ModbusModule.Status=SEND_END;
                                SetupSCI();
                                ConfigureModbus();
                        }
                        break;               
        }
        CpuTimer0.InterruptCount=0;
        LinaRegs.SCIGCR1.bit.RXENA = 0;                 //Disable RX
        LinaRegs.SCIGCR1.bit.TXENA = 1;                 //Enable TX
        PieCtrlRegs.PIEACK.bit.ACK9=1;
}
Uint16 GetCRC16(Uint16 volatile* ptr,Uint16 len)
{
        Uint16 i,j;
        Uint16 crc=0xffff;
        for(i=0;i<len;i++)
        {
                crc^=(*ptr);
                for(j=0;j<8;j++)
                {
                        if(crc&1)
                        {
                                crc>>=1;
                                crc&=0xA001;
                        }
                        else
                                crc>>=1;
                }
                ptr++;
        }
        return(crc);
}
void ModbusSlaveSetNHIdRegAnswer(Uint16 board_adr,Uint16 start_address,Uint16 lenth)
{
        Uint16 i,j;
        i=0;j=0;
        ModbusModule.Buf[i++]=board_adr;
        ModbusModule.Buf[i++]=SET_N_HLD_REG;
        ModbusModule.Buf[i++]=WORD_HI(start_address);
        ModbusModule.Buf[i++]=WORD_LO(start_address);
        ModbusModule.Buf[i++]=WORD_HI(lenth);
        ModbusModule.Buf[i++]=WORD_LO(lenth);
        j=GetCRC16(ModbusModule.Buf,i);
        ModbusModule.Buf[i++]=WORD_HI(j);
        ModbusModule.Buf[i++]=WORD_LO(j);
        ModbusModule.Txlen=i;
        ModbusModule.Point=0;
}
void ModbusSlaveReadNHIdRegAnswer(Uint16 board_adr,Uint16 lenth)
{
        Uint16 i,j,firstaddr;
        Uint16 *FirstAddr;
        i=0;j=0;
        firstaddr=(ModbusModule.Buf[2]<<8)+ModbusModule.Buf[3];
        FirstAddr=(Uint16 *)firstaddr;
        ModbusModule.Buf[i++]=board_adr;
        ModbusModule.Buf[i++]=READ_HLD_REG;
        ModbusModule.Buf[i++]=(lenth<<1);
        for(j=0;j<lenth;j++)
        {
                ModbusModule.Buf[i++]=WORD_HI(*(j+FirstAddr));
                ModbusModule.Buf[i++]=WORD_LO(*(j+FirstAddr));
        }
        j=GetCRC16(ModbusModule.Buf,i);
        ModbusModule.Buf[i++]=WORD_HI(j);
        ModbusModule.Buf[i++]=WORD_LO(j);
        ModbusModule.Rxlen=i;
        ModbusModule.Point=0;
}
Uint16 WORD_HI(Uint16 i)
{
        return(i>>8);
}
Uint16 WORD_LO(Uint16 i)
{
        i<<=8;
        return(i>>8);
}
Uint16 RTUSlaveFrameAnalyse(void)
{
        Uint16 RegsLenth;
        Uint16 crc_tmp,crc_result;
        Uint16 RegAddr,RegNum;
        crc_tmp=(ModbusModule.Buf[ModbusModule.Rxlen-2]<<8)+ModbusModule.Buf[ModbusModule.Rxlen-1];
        crc_result=GetCRC16(ModbusModule.Buf,ModbusModule.Rxlen-2);
        if(crc_result!=crc_tmp)
                return 1;
        if(ModbusModule.ID!=ModbusModule.Buf[0])
                return 2;
        ModbusModule.FunCode=ModbusModule.Buf[1];
        switch(ModbusModule.FunCode)
        {
                case 03:
                RegsLenth=(ModbusModule.Buf[ModbusModule.Rxlen-4]<<8)+ModbusModule.Buf[ModbusModule.Rxlen-3];
                ModbusSlaveReadNHIdRegAnswer(ModbusModule.ID,RegsLenth);
                break;
                case 16:
                RegAddr=(ModbusModule.Buf[2]<<8)+ModbusModule.Buf[3];
                RegNum=(ModbusModule.Buf[4]<<8)+ModbusModule.Buf[5];
                if((RegNum<<1)!=ModbusModule.Buf[6])
                {
                        return 4;
                }
                ModbusSlaveSetNHIdRegAnswer(ModbusModule.ID,RegAddr,RegNum);
                break;
        }
        return 0;
}
void ModbusModuleRTUSlaveRun(void)
{
        if(RTUSlaveFrameAnalyse()==0)
        {
                ModbusModule.Status=SEND_START;
                LinaRegs.SCIGCR1.bit.RXENA = 0;                 //Disable RX
                LinaRegs.SCIGCR1.bit.TXENA = 1;                 //Enable TX
        }
        else
        {
                ModbusModule.Status=SEND_END;
               
                ConfigureModbus();
        }
}
interrupt void cpu_time0_isr(void)
{
        CpuTimer0.InterruptCount++;
        EALLOW;
        SysCtrlRegs.WDKEY=0xAA;
        SysCtrlRegs.WDKEY=0x55;
        EDIS;
        PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;
}
void SetupSCI(void)
{
        //Allow write to protected registers
        EALLOW;

        LinaRegs.SCIGCR0.bit.RESET = 0; //Into reset
        LinaRegs.SCIGCR0.bit.RESET = 1; //Out of reset

        LinaRegs.SCIGCR1.bit.SWnRST = 0; //Into software reset

        //SCI Configurations
        LinaRegs.SCIGCR1.bit.COMMMODE = 0;   //Idle-Line Mode
        LinaRegs.SCIGCR1.bit.TIMINGMODE = 1; //Asynchronous Timing
        LinaRegs.SCIGCR1.bit.PARITYENA = 0;  //No Parity Check
        LinaRegs.SCIGCR1.bit.PARITY = 0;         //Odd Parity
        LinaRegs.SCIGCR1.bit.STOP = 0;                 //One Stop Bit
        LinaRegs.SCIGCR1.bit.CLK_MASTER = 1; //Enable SCI Clock
        LinaRegs.SCIGCR1.bit.LINMODE = 0;         //SCI Mode
        LinaRegs.SCIGCR1.bit.SLEEP = 0;      //Ensure Out of Sleep
        LinaRegs.SCIGCR1.bit.MBUFMODE = 1;         //Buffered Mode
        LinaRegs.SCIGCR1.bit.LOOPBACK = 1;   //Internal Loopback
        LinaRegs.SCIGCR1.bit.CONT = 1;                 //Continue on Suspend
        LinaRegs.SCIGCR1.bit.RXENA = 1;                 //Enable RX
        LinaRegs.SCIGCR1.bit.TXENA = 1;                 //Enable TX

        //Ensure IODFT is disabled
    LinaRegs.IODFTCTRL.bit.IODFTENA = 0x0;

    //Set transmission length
    LinaRegs.SCIFORMAT.bit.CHAR = 7;         //Eight bits
    LinaRegs.SCIFORMAT.bit.LENGTH = 7;   //Eight bytes

        //Set baudrate
    LinaRegs.BRSR.bit.P = 96;         //19.2 kbps for SYSCLKOUT = 60 MHz
    LinaRegs.BRSR.bit.M = 10;

        //Enable interrupts
        LinaRegs.SCISETINT.bit.SETRXINT = 1; //Enable RX interrupt

    //Set interrupt priority
        LinaRegs.SCICLEARINTLVL.all = 0xFFFFFFFF; //Set Int level of all interrupts to LVL 0

    LinaRegs.SCIGCR1.bit.SWnRST = 1;  //bring out of software reset

        //Disable write to protected registers
        EDIS;


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产亚洲www | 中文字幕一区二区三区精彩视频 | 午夜一级黄色片 | 日本精品久久 | 欧美天堂在线观看 | 免费激情av | 先锋资源在线 | 久久99深爱久久99精品 | 亚洲综合区| 91日b| 欧美黄a | 日本精品视频一区二区 | 国产精品久久久久久久久 | 日本人爽p大片免费看 | 国产精品久久久久久久模特 | 91精品久久久久久久久久 | 激情av免费看 | www狠狠干| 亚洲九九 | 午夜精品三区 | 精品国产乱码 | 久久最新网址 | 国产在线播 | 日本在线一二 | 中文字幕精品视频 | 亚洲欧美在线观看视频 | 毛片一级片 | 成人精品啪啪欧美成 | 婷婷国产一区二区三区 | 久久99蜜桃综合影院免费观看 | 丝袜一区二区三区 | 请别相信他免费喜剧电影在线观看 | 草草视频在线观看 | 欧美日韩福利 | 国产精品资源在线观看 | 日日骚网 | 日本午夜一区 | 美女福利网站 | 户外露出一区二区三区 | 日本天天操 | 国产精品视频久久久久 |