This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

编码器无法获取电机转子角度数据

Other Parts Discussed in Thread: C2000WARE

TI 工程师:您好!我做编码器实验的时候,发现编码器无法获取电机转子的位置信息,且我发现程序会卡在 while(tformatData.dataReady != 1) ;//{;}。我用的是TI的 F28379D板子(launchpad)+BOOSTL-POSMGR(编码器接口板)。然后利用的程序时TI的例程:D:\ti\c2000\C2000Ware_MotorControl_SDK_3_01_00_00\solutions\boostxl_posmgr\f2837xd。   因为我考虑到自己实际使用的tformat编码器命令ID与例程有所不同,所以就此进行修改,但是发现出不来结果。希望能给与解答,谢谢!

  • 自己实际使用的tformat编码器命令ID与例程有所不同,所以就此进行修改

    你好,具体修改的是什么?

  • 将图一的内容改为图2的内容。

                            图1

                           图2

    具体修改的代码就是:uint16_t PM_tformat_setupCommand(uint16_t tformatDataID, uint16_t eepromAddr,uint16_t eepromData, uint16_t crcSend) 和uint16_t PM_tformat_receiveData(uint16_t tformatDataID)以及主函数main的while循环。

    uint16_t PM_tformat_setupCommand(uint16_t tformatDataID, uint16_t eepromAddr,
                                     uint16_t eepromData, uint16_t crcSend)
    {
        uint16_t sendClks;
        uint16_t receiveClks;
        uint16_t dummySPIClks;
        uint16_t i;
        uint16_t word1, word2, word3, temp;
        uint16_t addrl, datal;
    
        tformat_resetCLB();
        tformatData.dataReady = 0;
    
        word1 = (tformatDataID << 6) | 0x903F;
    
        switch(tformatDataID)
        {
           case (PM_TFORMAT_DATAID2):
           sendClks = ABIT + PACKET_BITS + IDLE_BITS;
           receiveClks =  4*PACKET_BITS ;
    
           if(((sendClks + receiveClks) % 16) == 0)
           {
            tformatData.fifoLevel =  ((sendClks + receiveClks) / 16);
           }
           else
           {
           tformatData.fifoLevel = ((sendClks + receiveClks) / 16) + 1;
           }
    
           dummySPIClks = (tformatData.fifoLevel * 16) -(sendClks + receiveClks);
    
           tformat_configureSPILen(15);
    
            //
            //void tformat_configureCLBLen(uint16_t CLB4_C1_M1,
            // uint16_t CLB4_C1_M2, uint16_t CLB4_R0)
            //
            tformat_configureCLBLen((PACKET_BITS + 2), sendClks,receiveClks + dummySPIClks);
    
            tformatData.sdata[0] = word1;
            tformatData.sdata[1] = 0xFFFF;
            tformatData.sdata[2] = 0xFFFF;
            tformatData.sdata[3] = 0xFFFF;
            for (i = 0;i < tformatData.fifoLevel;i++)
            {
               SPI_writeDataNonBlocking(PM_TFORMAT_SPI, tformatData.sdata[i]);
            }
    
            break;
    
           case (PM_TFORMAT_DATAID3):
                   sendClks = ABIT + PACKET_BITS + IDLE_BITS;
                   receiveClks = 11* PACKET_BITS ;
    
                   if(((sendClks + receiveClks) % 16) == 0)
                   {
                    tformatData.fifoLevel =  ((sendClks + receiveClks) / 16);
                   }
                   else
                   {
                   tformatData.fifoLevel = ((sendClks + receiveClks) / 16) + 1;
                   }
    
                   dummySPIClks = (tformatData.fifoLevel * 16) -(sendClks + receiveClks);
    
                   tformat_configureSPILen(15);
    
                    //
                    //void tformat_configureCLBLen(uint16_t CLB4_C1_M1,
                    // uint16_t CLB4_C1_M2, uint16_t CLB4_R0)
                    //
                    tformat_configureCLBLen((PACKET_BITS + 2), sendClks,receiveClks + dummySPIClks);
    
                    tformatData.sdata[0] = word1;
                    tformatData.sdata[1] = 0xFFFF;
                    tformatData.sdata[2] = 0xFFFF;
                    tformatData.sdata[3] = 0xFFFF;
                    for (i = 0;i < tformatData.fifoLevel;i++)
                    {
                       SPI_writeDataNonBlocking(PM_TFORMAT_SPI, tformatData.sdata[i]);
                    }
    
                    break;
    
           case (PM_TFORMAT_DATAID4):
            sendClks = ABIT + PACKET_BITS + IDLE_BITS;
            receiveClks = 7* PACKET_BITS ;
    
            if(((sendClks + receiveClks) % 16) == 0)
            {
            tformatData.fifoLevel =  ((sendClks + receiveClks) / 16);
            }
            else
            {
            tformatData.fifoLevel = ((sendClks + receiveClks) / 16) + 1;
            }
    
            dummySPIClks = (tformatData.fifoLevel * 16) -(sendClks + receiveClks);
    
            tformat_configureSPILen(15);
    
            //
            //void tformat_configureCLBLen(uint16_t CLB4_C1_M1,
            // uint16_t CLB4_C1_M2, uint16_t CLB4_R0)
            //
            tformat_configureCLBLen((PACKET_BITS + 2), sendClks,receiveClks + dummySPIClks);
    
            tformatData.sdata[0] = word1;
            tformatData.sdata[1] = 0xFFFF;
            tformatData.sdata[2] = 0xFFFF;
            tformatData.sdata[3] = 0xFFFF;
            for (i = 0;i < tformatData.fifoLevel;i++)
            {
             SPI_writeDataNonBlocking(PM_TFORMAT_SPI, tformatData.sdata[i]);
             }
    
             break;
    
           case (PM_TFORMAT_DATAID5):
                   sendClks = ABIT + PACKET_BITS + IDLE_BITS;
                   receiveClks =9* PACKET_BITS ;
    
                   if(((sendClks + receiveClks) % 16) == 0)
                   {
                   tformatData.fifoLevel =  ((sendClks + receiveClks) / 16);
                   }
                   else
                   {
                   tformatData.fifoLevel = ((sendClks + receiveClks) / 16) + 1;
                   }
    
                   dummySPIClks = (tformatData.fifoLevel * 16) -(sendClks + receiveClks);
    
                   tformat_configureSPILen(15);
    
                   //
                   //void tformat_configureCLBLen(uint16_t CLB4_C1_M1,
                   // uint16_t CLB4_C1_M2, uint16_t CLB4_R0)
                   //
                   tformat_configureCLBLen((PACKET_BITS + 2), sendClks,receiveClks + dummySPIClks);
    
                   tformatData.sdata[0] = word1;
                   tformatData.sdata[1] = 0xFFFF;
                   tformatData.sdata[2] = 0xFFFF;
                   tformatData.sdata[3] = 0xFFFF;
                   for (i = 0;i < tformatData.fifoLevel;i++)
                   {
                    SPI_writeDataNonBlocking(PM_TFORMAT_SPI, tformatData.sdata[i]);
                    }
    
                    break;
    
            case (PM_TFORMAT_DATAID7):
            case (PM_TFORMAT_DATAID8):
            case (PM_TFORMAT_DATAIDC):
    
                sendClks = ABIT + PACKET_BITS + IDLE_BITS;
                receiveClks = 6 * PACKET_BITS ;
    
                if(((sendClks + receiveClks) % 16) == 0)
                {
                    tformatData.fifoLevel =  ((sendClks + receiveClks) / 16);
                }
                else
                {
                    tformatData.fifoLevel = ((sendClks + receiveClks) / 16) + 1;
                }
    
                dummySPIClks = (tformatData.fifoLevel * 16) -
                                (sendClks + receiveClks);
    
                tformat_configureSPILen(15);
    
                //
                //void tformat_configureCLBLen(uint16_t CLB4_C1_M1,
                // uint16_t CLB4_C1_M2, uint16_t CLB4_R0)
                //
                tformat_configureCLBLen((PACKET_BITS + 2), sendClks,receiveClks + dummySPIClks);
    
                tformatData.sdata[0] = word1;
                tformatData.sdata[1] = 0xFFFF;
                tformatData.sdata[2] = 0xFFFF;
                tformatData.sdata[3] = 0xFFFF;
                for (i = 0;i < tformatData.fifoLevel;i++)
                {
                    SPI_writeDataNonBlocking(PM_TFORMAT_SPI, tformatData.sdata[i]);
                }
    
            break;
    
            case (PM_TFORMAT_DATAIDD):
                sendClks = ABIT + 3 * PACKET_BITS + IDLE_BITS;
                receiveClks = 4 * PACKET_BITS ;
    
                addrl = (__flip32(eepromAddr) >> 24) & 0xFE;    // busy "0"
                temp = (addrl >> 4) & 0xF;
                word1 = (tformatDataID << 6) | 0x9020 | temp;
                temp = (addrl  & 0xF) << 12;
                word2 = temp | 0x803 | (crcSend << 2);
    
                if(((sendClks + receiveClks) % 16) == 0)
                {
                    tformatData.fifoLevel =  ((sendClks + receiveClks) / 16);
                }
                else
                {
                    tformatData.fifoLevel = ((sendClks + receiveClks) / 16) + 1;
                }
                dummySPIClks = (tformatData.fifoLevel * 16) -
                        (sendClks + receiveClks);
    
                tformat_configureSPILen(15);
    
                //
                //void tformat_configureCLBLen(uint16_t CLB4_C1_M1,
                //uint16_t CLB4_C1_M2, uint16_t CLB4_R0)
                //
                tformat_configureCLBLen((3 * PACKET_BITS + 2), sendClks,
                        receiveClks + dummySPIClks);
    
                tformatData.sdata[0] = word1;
                tformatData.sdata[1] = word2;
                tformatData.sdata[2] = 0xFFFF;
                tformatData.sdata[3] = 0xFFFF;
                for (i = 0;i < tformatData.fifoLevel;i++)
                {
                    SPI_writeDataNonBlocking(PM_TFORMAT_SPI, tformatData.sdata[i]);
                }
    
            break;
    
            case (PM_TFORMAT_DATAID6):
    
                sendClks = ABIT + 4 * PACKET_BITS + IDLE_BITS;
                receiveClks = 4 * PACKET_BITS ;
    
                addrl = (__flip32(eepromAddr) >> 24) & 0xFE;    // busy "0"
                datal = (__flip32(eepromData) >> 24) & 0xFF;
                temp = (addrl >> 4) & 0xF;
                word1 = (tformatDataID << 6) | 0x9020 | temp;
                temp = (addrl  & 0xF) << 12;
                word2 = temp | 0x802 | (datal << 2);
                word3 = (crcSend << 8) | 0xFF;
    
                if(((sendClks + receiveClks) % 16) == 0)
                {
                    tformatData.fifoLevel =  ((sendClks + receiveClks) / 16);
                }
                else
                {
                    tformatData.fifoLevel = ((sendClks + receiveClks) / 16) + 1;
                }
    
                dummySPIClks = (tformatData.fifoLevel * 16) -
                        (sendClks + receiveClks);
    
                tformat_configureSPILen(15);
    
                tformat_configureCLBLen((4 * PACKET_BITS + 2), sendClks,
                                        receiveClks + dummySPIClks);
    
                tformatData.sdata[0] = word1;
                tformatData.sdata[1] = word2;
                tformatData.sdata[2] = word3;
                tformatData.sdata[3] = 0xFFFF;
                for (i = 0;i < tformatData.fifoLevel;i++)
                {
                    SPI_writeDataNonBlocking(PM_TFORMAT_SPI, tformatData.sdata[i]);
                }
    
            break;
    
            default:
                word1 = 0;
            break;
    
        }
        return(word1);
    }
    
    
    uint16_t PM_tformat_receiveData(uint16_t tformatDataID)
    {
        uint32_t len, bitIndex, wordNo;
        uint16_t word1;
    
        word1  = 1;
    
        switch(tformatDataID)
        {
            case (PM_TFORMAT_DATAID2):
            len = 8;
            bitIndex = 13;
            wordNo = 1;
            tformatData.controlField = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.statusField = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField0 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.crc = tformat_getBits (len, wordNo, bitIndex);
    
            tformatData.rxPkts[0] = ((uint32_t) tformatData.controlField << 16)
                                                | ((uint32_t) tformatData.statusField << 8)
                                                | ((uint32_t) tformatData.dataField0);
            break;
    
            case (PM_TFORMAT_DATAID3):
            len = 8;
            bitIndex = 13;
            wordNo = 1;
            tformatData.controlField = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.statusField = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField0 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField1 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField2 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField3 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField4 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField5 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField6 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField7 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.crc = tformat_getBits (len, wordNo, bitIndex);
    
            tformatData.rxPkts[0] = ((uint32_t) tformatData.controlField << 24)
                                             | ((uint32_t) tformatData.statusField << 16)
                                             | ((uint32_t) tformatData.dataField0 << 8)
                                             | (uint32_t) tformatData.dataField1;
    
            tformatData.rxPkts[1] = ((uint32_t) tformatData.dataField2 << 24) |
                                               ((uint32_t) tformatData.dataField3 << 16) |
                                               ((uint32_t) tformatData.dataField4 << 8) |
                                               ((uint32_t) tformatData.dataField5);
    
            tformatData.rxPkts[2] = ((uint32_t) tformatData.dataField6 << 8) |
                                                 ((uint32_t) tformatData.dataField7);
    
            break;
    
            case (PM_TFORMAT_DATAID4):
            len = 8;
            bitIndex = 13;
            wordNo = 1;
            tformatData.controlField = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.statusField = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField0 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField1 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField2 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField3 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.crc = tformat_getBits (len, wordNo, bitIndex);
    
            tformatData.rxPkts[0] = ((uint32_t) tformatData.controlField << 24)
                                             | ((uint32_t) tformatData.statusField << 16)
                                             | ((uint32_t) tformatData.dataField0 << 8)
                                             | (uint32_t) tformatData.dataField1;
    
            tformatData.rxPkts[1] = ((uint32_t) tformatData.dataField2 <<8) |
                                               ((uint32_t) tformatData.dataField3);
    
            break;
    
            case (PM_TFORMAT_DATAID5):
            len = 8;
            bitIndex = 13;
            wordNo = 1;
            tformatData.controlField = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.statusField = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField0 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField1 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField2 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField3 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField4 = tformat_getBits (len, wordNo, bitIndex);
    
            wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
            bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
            tformatData.dataField5 = tformat_getBits (len, wordNo, bitIndex);
    
            tformatData.rxPkts[0] = ((uint32_t) tformatData.controlField << 24)
                                             | ((uint32_t) tformatData.statusField << 16)
                                             | ((uint32_t) tformatData.dataField0 << 8)
                                             | (uint32_t) tformatData.dataField1;
    
            tformatData.rxPkts[1] = ((uint32_t) tformatData.dataField2 << 24) |
                                               ((uint32_t) tformatData.dataField3 << 16) |
                                               ((uint32_t) tformatData.dataField4 << 8) |
                                               ((uint32_t) tformatData.dataField5);
    
            break;
    
            case (PM_TFORMAT_DATAID7):
            case (PM_TFORMAT_DATAID8):
            case (PM_TFORMAT_DATAIDC):
    
                len = 8;
    
                bitIndex = 13;
                wordNo = 1;
                tformatData.controlField = tformat_getBits (len, wordNo, bitIndex);
    
                wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
                bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
                tformatData.statusField = tformat_getBits (len, wordNo, bitIndex);
    
                wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
                bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
                tformatData.dataField0 = tformat_getBits (len, wordNo, bitIndex);
    
                wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
                bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
                tformatData.dataField1 = tformat_getBits (len, wordNo, bitIndex);
    
                wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
                bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
                tformatData.dataField2 = tformat_getBits (len, wordNo, bitIndex);
    
                wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
                bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
                tformatData.crc = tformat_getBits (len, wordNo, bitIndex);
    
                tformatData.rxPkts[0] = ((uint32_t) tformatData.controlField << 24)
                                        | ((uint32_t) tformatData.statusField << 16)
                                        | ((uint32_t) tformatData.dataField0 << 8)
                                        | ((uint32_t) tformatData.dataField1);
    
                tformatData.rxPkts[1] = ((uint32_t) tformatData.dataField2) ;
    
            break;
    
            case (PM_TFORMAT_DATAIDD):
                len = 8;
    
                bitIndex = 9;
                wordNo = 2;
                tformatData.controlField = tformat_getBits (len, wordNo, bitIndex);
    
                wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
                bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
                tformatData.eepromAddress = tformat_getBits (len,
                                wordNo, bitIndex);
    
                wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
                bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
                tformatData.eepromRdDtata = tformat_getBits (len,
                                wordNo, bitIndex);
    
                wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
                bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
                tformatData.crc = tformat_getBits (len, wordNo, bitIndex);
    
                tformatData.rxPkts[0] = ((uint32_t) tformatData.controlField << 16)
                                      | ((uint32_t) tformatData.eepromAddress << 8)
                                      | ((uint32_t) tformatData.eepromRdDtata);
            break;
    
            case (PM_TFORMAT_DATAID6):
    
                len = 8;
    
                bitIndex = 15;
                wordNo = 3;
                tformatData.controlField = tformat_getBits (len, wordNo, bitIndex);
    
                wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
                bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
                tformatData.eepromAddress = tformat_getBits (len, wordNo, bitIndex);
    
                wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
                bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
                tformatData.eepromRdDtata = tformat_getBits (len, wordNo, bitIndex);
    
                wordNo = wordNo + (10 + (16 - bitIndex) ) / 16;
                bitIndex = 16 - ((10 + (16 - bitIndex)) % 16) ;
                tformatData.crc = tformat_getBits (len, wordNo, bitIndex);
    
                tformatData.rxPkts[0] = ((uint32_t) tformatData.controlField << 16)
                                      | ((uint32_t) tformatData.eepromAddress << 8)
                                      | ((uint32_t) tformatData.eepromRdDtata);
                break;
    
        }
    
        return(word1);
    }
    
    
    
    // 主循环 
    while(1)
            {
                retVal1 = PM_tformat_setupCommand (PM_TFORMAT_DATAID3, 0, 0, 0);
                PM_tformat_startOperation();
                DEVICE_DELAY_US(10L);
                while(tformatData.dataReady != 1);// {}
                retVal1 = PM_tformat_receiveData(PM_TFORMAT_DATAID3);
    
                crcResult = PM_tformat_getCRC(0, 80, 8, (uint16_t *)&tformatData.rxPkts,
                            tformatCRCtable, 10);
                crcResult = crcResult ^ (0xFF);
                if(!tformat_checkCRC(crcResult, tformatData.crc))
                {
                     ESTOP0;
                }
    
                //
                //Invert the received bit sequence for position and
                //turns for actual data
                //
                position =
                    ((__flip32((uint32_t) tformatData.dataField0) >> 24 ) & 0xFF) |
                    ((__flip32((uint32_t) tformatData.dataField1) >> 16 ) & 0xFF00) |
                    ((__flip32((uint32_t) tformatData.dataField2) >> 8 )  & 0xFF0000);
    
                turns =
                    ((__flip32((uint32_t) tformatData.dataField4) >> 24 ) & 0xFF) |
                    ((__flip32((uint32_t) tformatData.dataField5) >> 16 ) & 0xFF00) |
                    ((__flip32((uint32_t) tformatData.dataField6) >> 8 )  & 0xFF0000);
    
                DEVICE_DELAY_US(400L);
            }
    
    
    

  • 卡在while应该是你的中断没进去,确认一下引脚是否跟下面参考设计中说明的一致,比如SPICLK引脚即GPIO65与GPIO7是否连接在一起?GPIO9的INXBAR是否被占用?

    这是接口参考设计,你可以看一下:https://www.ti.com.cn/cn/lit/ug/zhcu481c/zhcu481c.pdf 

    另外,这个帖子中有和你一样的问题,你可以参考一下:https://e2echina.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/119863/iddk_pm_servo_f2837x/334368?tisearch=e2e-sitesearch&keymatch=%25252522while%25252520%25252528tformatData.dataReady%25252520%25252521%2525253D%252525201%25252529%25252522#334368 

  • 我看你发的文档上,实现tformat编码器功能的GPIO口好像和手册上的不一样啊!

  • 你好,你是按照什么说明连接的GPIO口?

  • 我是按照这个来配置的。

  • 额,不好意思可能是我没说清楚。

    我的意思是你提到“实现tformat编码器功能的GPIO口好像和手册上的不一样”。那么具体你的引脚配置跟T-format文档中说明引脚配置有哪些差别呢?

  • 你发的文档实现tformat功能的是这几个GPIO口(图一),而我实现tformat配置的口是图二

                                        图1

                                          图2

    最主要是我现在利用的就是F28379d launchpad,例程也是针对于整个板子的,我的配置应该没问题,应该是你发的文档上GPIO口是错的。

    另外:如果有条件的话,您那边能不能把我的程序哪个你们美国那边工程师看一下,我卡在这里很久了,让他们帮忙处理一下,谢谢!        我用的编码器是多摩川的编码器(型号为TS5720N8401)

  • 抱歉最近公司杂事比较多,忘记回复了。

    因为你的问题描述比较复杂,方便的话可以自己操作在英文E2E论坛上发帖咨询国外工程师:https://e2e.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum