Проблема синхронизации битов данных и синхронизации данных - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь передать последовательность данных из ATSAME70Q21 в серию регистров сдвига (драйверы светодиодов TLC5971). Мое производственное оборудование, скорее всего, будет использовать аппаратный SPI для этой цели, но мой текущий прототип использует выводы GPIO, поэтому я бы хотел использовать битовую дробь.

Я довольно удобно размещаю данные вправильная последовательность в соответствии с таблицей данных TLC5971 и смещением каждого бита за раз. У меня есть осциллограф, подключенный к обеим линиям DATA (BBDAT) и CLOCK (BBCLK), который иллюстрирует что-то не совсем правильное с функцией.

Если я просто переключу каждую из линий BBDAT и BBCLK HIGH, а затемсразу же снова НИЗКИЙ, я получаю очень стабильный сигнал 1,85 МГц на обеих линиях осциллографа. Однако, когда я перебираю структуру данных, устанавливая DATA HIGH или LOW в зависимости от значения бита, а затем переключая CLOCK HIGH / LOW, частота результирующего сигнала на BBDAT примерно на порядок ниже, чем у BBCLK. Учитывая, что я переключаю BBCLK только один раз в конце каждого набора / сброса BBDAT, я не уверен, почему это так.

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);
            }
        }
    }

Приведенный выше код (без оптимизации) генерирует сигнал BBDAT~ 100 кГц и сигнал BBCLK ~ 1,4 МГц. Что мне здесь не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...