位爆炸数据和时钟同步问题

我正在尝试将一系列数据从ATSAME70Q21传递给一系列移位寄存器(TLC5971 LED驱动器)。我的生产硬件可能会为此目的使用硬件SPI,但是我当前的原型是利用GPIO引脚,因此我想使用位敲打。

我很愿意按照TLC5971数据表以正确的顺序排列数据,并一次移位每个位。我有一个同时连接到DATA(BbdaT)和CLOCK(BBCLK)线的示波器,这说明该功能不太正确。

如果我简单地将BbdaT和BBCLK线中的每条线切换为高电平,然后立即又再次为低电平,则在示波器的两条线上都会得到非常稳定的1.85MHz信号。但是,当我遍历数据结构时,根据位值将DATA设置为HIGH或LOW,然后切换CLOCK HIGH / LOW,则BbdaT上的最终信号频率大约比BBCLK的信号频率低一个数量级。鉴于我在每个BbdaT设置/清除结束时仅切换BBCLK一次,所以我不确定为什么会这样。

void writeData(void)
{
    Pio *baseData = (Pio *)(uintptr_t)PIOD;
    Pio *baseclock = (Pio *)(uintptr_t)PIOB;

    //I have 3 TLC5971 ICs in series,hence i < 3
    for (uint i = 0,i < 3; i++) {

        //Each packet for each TLC5971 IC is 28 bytes long
        for (uint j = 0; j < 28; j++) {
            for (uint k = 0; k < 8; k++) {
                if (dataPacket[i][j] & (1 << k)) {

                    //If bit is 1,Set DATA line (BbdaT)
                    baseData->PIO_SODR = 1U << (BbdaT & 0x1F);
                } else {

                    //If bit is 0,Clear DATA line (BbdaT)
                    baseData->PIO_CODR = 1U << (BbdaT & 0x1F);
                }

                //Toggle the CLOCK line (BBCLK)
                baseclock->PIO_SODR = 1U << (BBCLK & 0x1F);
                baseclock->PIO_CODR = 1U << (BBCLK & 0x1F);
            }
        }
    }

以上代码(无优化)产生〜100kHz的BbdaT信号和〜1.4MHz的BBCLK信号。我在这里想念什么?

qq44461443 回答:位爆炸数据和时钟同步问题

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3134384.html

大家都在问