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.

[参考译文] 在1秒内发送10000位

Guru**** 1835190 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/581632/sending-10-000-bits-in-1-second

我如何编写中断程序以在1秒内发送10000位曼彻斯特编码? 我使用的是 Tiva TM4C123G

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉回答得太慢了、但这个问题让我产生了很大的兴趣、我不得不尝试一下。 简而言之、我使用 SSI 的波特率是波特率的两倍(20、000位/秒)、并且每8位数据发送16位。 我选择使用查找表(512字节的闪存)对数据进行编码。 我任意地将上升沿用于0、将下降沿用于1、将0xFF 用于开始同步、将0x00用于结束同步。 这个简单的示例不使用中断、而只是进行轮询、以便在发送 FIFO 变空时将更多数据填充到发送 FIFO 中。 在传输结束之前、务必不要让 FIFO 为空。 第131行和134行进行了注释、因为无需输出时钟。 但是、您可以取消注释这些线、以查看与输出数据和 SSI 时钟的关系。

    //
    /////SSI
    曼彻斯特.c - SSI 发送曼彻斯特编码数据的简单示例。
    //
    //版权所有(c) 2013-2017 Texas Instruments Incorporated。 保留所有权利。
    //软件许可协议
    //
    //德州仪器(TI)提供此软件仅供
    和//仅供 TI 的微控制器产品使用。 软件归
    // TI 和/或其供应商所有,并受适用的版权
    //法律保护。 您不能将此软件与"病毒"开源
    //软件组合在一起以形成更大的程序。
    //
    //此软件按“原样”提供,且存在所有故障。
    //对于
    
    本软件,不作任何明示、暗示或法定的保证,包括但不限于对适销性和适用性的暗示保证//特定用途。 在任何
    //情况下、TI 不对任何
    原因造成的特殊、意外或必然//损害负责。
    ////////
    
    *************
    
    #include 
    #include 
    #include "tm4c1294ncppdt.h"
    #include "sysctl.h"
    #include "rom_map.h"
    #include
    "pin_map.h"
    #include "HW_memmap.h"
    #include "gpio.h"
    
    #define master ****SSI1_base
    
    
    void QSSIMasterInit (USCK_INIT)、USC32_INTCH
    
    
    *、无符号字符串/INTCH32位/INTOPh (USSIh)
    //
    //!
    //! 一个非常简单的示例、将一个字符串从 SSI
    //! 使用曼彻斯特编码(0 -上升沿、1 -下降沿)
    //
    *************
    const uint16_t conversionTable[256]=
    {
    0x5555、0x5556、0x5559、0x555A、0x5565、 0x5566、0x5569、0x556A、
    0x5595、0x5596、 0x5599、0x559A、0x55A5、0x55A6、0x55A9、 0x55AA、
    0x5655、0x5656、0x5659、0x565A、 0x5665、0x56666、0x5669、0x566A、
    0x56595、 0x5596、0x5699、0x569A、0x56A5、0x56A6、 0x56A9、0x56AA、
    0X5955、0x5956、0X5959、 0X595A、0X5965、0X5966、0X5969、0X596A、
    0X5995、0x5996、0X5999、0X599A、0X59A5、 0X59A6、0X59A9、0X59AA、
    0X5A55、0x5A56、 0X5A59、0X5A5A、0X5A65、0X5A66、0X5A69、 0X5A6A、
    0X5A95、0x5A96、0X5A99、0X5A9A、 0X5AA5、0X5AA6、0X5AA9、0X5AAA、
    0X6555、 0x6556、0X6559、0X655A、0X6565、0X6566、 0X6569、0X656A、
    0X6595、0x6596、0X6599、 0X659A、0X65A5、0X65A6、0X65A9、0X65AA、
    0X6655、0x6656、0X6659、0X665A、0X6665、 0X6666、0X6669、0X666A、
    0X6695、0x6696、 0x6699、0X669A、0X66A5、0X66A6、0X66A9、 0X66AA、
    0X6955、0x6956、0X6959、0X695A、 0X6965、0X6966、0X6969、0X696A、
    0X6995、 0x6996、0X6999、0X699A、0X69A5、0X69A6、 0X69A9、0X69AA、
    0X6A55、0x6A56、0X6A59、 0X6A5A、0X6A65、0X6A66、0X6A69、0X6A6A、
    0X6A95、0x6A96、0X6A99、0X6A9A、0X6AA5、 0X6AA6、0X6AA9、0X6AAA、
    0X9555、0x9556、 0X9559、0X9555A、0X9565、0X9566、0X9569、 0X956A、
    0X9595、0x9596、0X9599、0X959A、 0X95A5、0X95A6、0X95A9、0X95AA、
    0X9655、 0x9656、0X9659、0X965A、0X9665、0X9666、 0X9669、0X966A、
    0X9695、0x9696、0X9699、 0X969A、0X96A5、0X96A6、0X96A9、0X96AA、
    0X9955、0x9956、0X9959、0X995A、0X9965、 0X9966、0X9969、0X996A、
    0X9995、0x9996、 0X9999、0X999A、0X99A5、0X99A6、0X99A9、 0X99AA、
    0X9A55、0x9A56、0X9A59、0X9A5A、 0X9A65、0X9A66、0X9A69、0X9A6A、
    0X9A95、 0x9A96、0X9A99、0X9A9A、0X9AA5、0X9AA6、 0X9AA9、0X9AAA、
    0XA555、0xA556、0XA559、 0XA55A、0XA565、0XA566、0XA569、0XA56A、
    0XA595、0xA596、0XA599、0XA59A、0XA5A5、 0XA5A6、0XA5A9、0XA5AA、
    0XA655、0xA656、 0XA659、0XA65A、0XA665、0XA666、0XA669、 0XA66A、
    0XA695、0xA696、0XA699、0XA69A、 0XA6A5、0XA6A6、0XA6A9、0XA6AA、
    0XA955、 0xA956、0XA959、0XA95A、0XA965、0XA966、 0XA969、0XA96A、
    0XA995、0xA996、0XA999、 0XA99A、0XA9A5、0XA9A6、0XA9A9、0XA9AA、
    0XAA55、0xAA56、0XAA59、0XAA5A、0XAA65、 0XAA66、0XAA69、0XAA6A、
    0XAA95、0xAA96、 0XAA99、0XAA9A、0XAAA5、0XAAA6、0XAAA9、 0XAAAA
    };
    
    const unsigned char myString[]={"快速棕色狐狸跳过懒狗\n\r\n\r\n\r 000"};
    
    int
    main (void)
    {
    uint32_t SYSCLK_Freq、波特率;
    const unsigned char * charPtr;
    
    SysCtlClockFreqSet (SYSCTL_OSC_INT、SYSCTL_SYSDIV_1 | SYSCTL_USE_PLL);
    SYSCLK_Freq = SysCtlClockGet ();
    BAUD_RATE = 20000;//以两倍于曼彻斯特编码位速率运行 SSI
    
    //
    //启用用于板载 LED 的 GPIO 端口。
    //
    SYSCTL_RCGCGPIO_R = SYSCTL_RCGCGPIO_R12;
    
    
    //将 SSI3初始化为 BI 主站
    QSSIMasterInit (SYSCLK_Freq、BAUD_RATE);
    
    //
    将数据发送出去主控方
    //
    charPtr = myString;
    SSIPutManchester (主控方、0xFFu);//在
    (* charPtr!= 0)
    {
    SSIPutManchester (主控方、* charPtr);
    charPtr+
    
    、0x00m彻 斯特+; //帧结束
    
    }
    
    void SSIPutManchester (int SSIBase、unsigned char 字符)
    {
    SSIDataPut (SSIBase、(convisionTable[character]);
    }
    
    
    //初始化 SSI1为主
    控方 void QSSIMasterInit (uint32_t SYSCLK_Freq、uint32_t Sysbaud _rate)
    {uint1_sysctl
    (ssnat_perl);}
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
    
    // MAP_GPIOPinConfigure (GPIO_PB5_SSI1CLK);
    MAP_GPIOPinConfigure (GPIO_PE4_SSI1XDAT0);
    
    // MAP_GPIOPinTypeSSI (GPIO_PORTB_AHB_BASE、GPIO_PIN_5);
    MAP_GPIOPinTypeSSI (GPIO_Porte AHB_BASE、GPIO_PIN_4);
    
    MAP_SSIConfigSetExpClk (主器件、SYSCLK_Freq、SSI_FRF_MOTO_MOTO_1、SSI_MODE_MASTER、BAUD_RATE、 16);
    MAP_SSIEnable (主器件);
    SSIAdvModeSet (主站、SSI_ADV_MODE_LEGACY_LEGACY_}