我正在尝试将一系列数据从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信号。我在这里想念什么?