RR2021 2 April 29, 2025 Posted April 29, 2025 (edited) · Report post Коротко: пытаюсь наладить обмен данными по SPI c ads1292(0меряет пульс дыхание итд), однобайтовые команды проходят на них есть соответствующая реакция микросхемы, ( например START 0x08 и STOP 0x0A). А вот команды состоящие из нескольких байт т.е. прочитать регистр или записать игнорируются Уже что только не пробовал , кончились идеи , может кто-то с подобным сталкивался , посоветуйте где искать куда копать Подробно: я настраиваю микросхему в соответствии с последовательностью на первом рисунке Потом пытаюсь несколько раз прочитать нулевой регистр микросхемы ID Control Register Отправляя команду SDATC, STOP и чтение регистра как рекомендуют здесь https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/775262/faq-ads129x-i-m-having-trouble-communicating-with-my-ads129x-device-via-spi-what-debug-steps-i-should-try по идее я должен получить значение 0х73, но мне приходят разные значения больше похожие на то что я считываю данные в режиме RDATAC Enable Read Data Continuous mode (хотя то что я отправляю в точности как в примере, вижу это на анализаторе сигналов последний рисунок). This mode is the default mode at power-up.(1) НО после отправки команд SDATC и STOP перед каждысм считыванием режим RDATAC отключается я вижу что нет импульсов на пине DRDY и он в еденице. На рисунке 3 то что я вижу лог анализатором я внёс задержки между байтами потому что есть tSDECODE (Command decode time ) минимум 4 tCLKs частота работы микросхемы от внутреннего генератора по идее 2.048 MHz. Скорость SPI 656 килобит CPOL = 0 and CPHA = 1. CLKSEL подтянут к питанию через резистор Микросхема питается от 3,3 На На опорное напряжение заведено 5 в на этих ножках присутствуют требуемые напряжения VCAP1 = AVSS + 1.2 V VCAP2 = AVDD +1.9 V Как сказано здесь https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/775288/faq-ads129x-how-do-i-verify-that-my-ads129x-device-is-still-functional/2868597#2868597 на картинке посылка команд SDATC(0х11) STOP (0хА0) и чтение регистра 0х20 0х00 0х00 https://iimg.su/i/SLHvyH ссылка на картинку в нормальном размере вот код инициализации и функция чтения регистра, записи регистра, и SPIx_TransferByte void init_1292 (void){ static uint8_t tmp = 0; uint8_t reg_bits = 0; delay_us(1); ads1292_gpio_init(); ADS1292_CS_HIGH; ADS1292_START_LOW; //Analog/Digital Power-Up //Set CLKSEL Pin = 1 and Wait for Oscillator LL_mDelay(3000); /*Set PWDN/RESET = 1 Wait for 1 s for Power-On Reset*/ ADS1292_RESET_PWDN_HIGH; LL_mDelay(3000);// Delay for Power-On Reset and Oscillator Start-Up ADS1292_RESET_PWDN_LOW; delay_us(35); ADS1292_RESET_PWDN_HIGH; LL_mDelay(1000); tmp = send_command_ads1292( SPI_ADS1292, ADS1292_CMD_SDATAC); //Send SDATAC Command LL_mDelay(10); //External Reference NO reg_bits = (ADS1292_CONFIG2_PDB_REFBUF | ADS1292_CONFIG2_7BIT_MUST_BE_1); //// If Using Internal Reference, Send This Command-- WREG CONFIG2 A0h0xA0; ads1292_write_register(ADS1292_REG_CONFIG2, reg_bits); // LL_mDelay(1000); reg_bits = 0x02;//DRATE = 500 SPS ads1292_write_register(ADS1292_REG_CONFIG1, reg_bits); // LL_mDelay(10); reg_bits = 0x01; ads1292_write_register(ADS1292_REG_CH1SET, reg_bits); LL_mDelay(10); ads1292_write_register(ADS1292_REG_CH2SET, reg_bits); LL_mDelay(10); send_command_ads1292(SPI_ADS1292, ADS1292_CMD_START); LL_mDelay(1); tmp = send_command_ads1292( SPI_ADS1292, ADS1292_CMD_RDATAC); // Put the Device Back in RDATAC Mode RDATAC LL_mDelay(1); // здесь Look for DRDY and Issue 24 + n 24 SCLKs /* Activate a (1 mV VREF/2.4) Square-Wave Test Signal On All Channels SDATAC WREG CONFIG2 A3h WREG CHnSET 05h RDATAC */ tmp = send_command_ads1292( SPI_ADS1292, ADS1292_CMD_SDATAC); //Send SDATAC Command LL_mDelay(1); LL_mDelay(10);////nrr_additionally reg_bits = 0xA3; ///(ADS1292_CONFIG2_PDB_REFBUF | ADS1292_CONFIG2_CLK_EN | ADS1292_CONFIG2_7BIT_MUST_BE_1 | ADS1292_CONFIG2_VREF_4V); //0xA8; //ADS1292_CONFIG2_PDB_REFBUF; ads1292_write_register(ADS1292_REG_CONFIG2, reg_bits); // LL_mDelay(1000); reg_bits = 0x05; ads1292_write_register(ADS1292_REG_CH1SET, reg_bits); LL_mDelay(10); ads1292_write_register(ADS1292_REG_CH2SET, reg_bits); LL_mDelay(10); tmp = send_command_ads1292( SPI_ADS1292, ADS1292_CMD_RDATAC); // Put the Device Back in RDATAC Mode RDATAC LL_mDelay(1); // Look for DRDY and Issue 24 + n 24 SCLKs conf_end = 1; //************************************************************************** LL_mDelay(1000); ////// чтение control регистра read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); read_control_register(); LL_mDelay(1); // } void read_control_register(void){ uint8_t value; char buf[32]; // Выйти из непрерывного режима данных send_command_ads1292(SPI_ADS1292, ADS1292_CMD_SDATAC); delay_us(10); // задержка более 4·tCLK, чтобы микросхема перестроилась send_command_ads1292(SPI_ADS1292, ADS1292_CMD_STOP); delay_us(10); // задержка более 4·tCLK, чтобы микросхема перестроилась // Удерживать CS низким на время burst-чтения ADS1292_CS_LOW; delay_us(1); // Отправить RREG + адрес = 0x20 | 0x00 SPIx_TransferByte(SPI_ADS1292, ADS1292_CMD_RREG | (ADS1292_REG_ID & 0x1F)); delay_us(4); // Отправить длину–1 = 0 (читаем 1 регистр) SPIx_TransferByte(SPI_ADS1292, 0x00); delay_us(4); // Принять единственный байт — значение Control Register value = SPIx_TransferByte(SPI_ADS1292, 0x00); // Отпустить CS delay_us(1); ADS1292_CS_HIGH; // 7) Вывести результат в UART int len = snprintf(buf, sizeof(buf), "Control Reg (0x%02X) = 0x%02X\r\n", ADS1292_REG_ID, value); if (len > 0 && len < (int)sizeof(buf)) { putstr_1((uint8_t*)buf); } } uint8_t send_command_ads1292(SPI_TypeDef *SPIx, uint8_t data) { uint8_t resp; // 1) Выбор ADS1292 ADS1292_CS_LOW; delay_us(1); // 2) Передача и приём одного байта resp = SPIx_TransferByte(SPIx, data); // 3) Отпуск CS delay_us(1); ADS1292_CS_HIGH; return resp; } void ads1292_write_register(uint8_t reg, uint8_t value) { ADS1292_CS_LOW; delay_us(1); // Отправляем WREG + адрес SPIx_TransferByte(SPI_ADS1292, ADS1292_CMD_WREG | (reg & 0x1F)); delay_us(4); // пишем 1 регистр SPIx_TransferByte(SPI_ADS1292, 0x00); delay_us(4); // Собственно data SPIx_TransferByte(SPI_ADS1292, value); delay_us(1); ADS1292_CS_HIGH; } uint8_t SPIx_TransferByte(SPI_TypeDef *SPIx, uint8_t data) { uint8_t tmp_d = 0; /* 1) пишем в DR */ LL_SPI_TransmitData8(SPIx, data); /* 2) ждём, пока TXE (пустой сдвиговый регистр) */ while (!LL_SPI_IsActiveFlag_TXE(SPIx)); /* 3) ждём, пока BSY (линия свободна) — кадр окончательно ушёл */ while (LL_SPI_IsActiveFlag_BSY(SPIx)); /* 4) читаем принятый байт из DR */ tmp_d = LL_SPI_ReceiveData8(SPIx); return tmp_d; } по уарту получаю примерно вот такие значения "одного и того же регистра " по анализатору на шине SPI вижу что именно это мне и отвечает микросхема Control Reg (0x00) = 0xD0<CR> Control Reg (0x00) = 0xED<CR> Control Reg (0x00) = 0xC0<CR> Control Reg (0x00) = 0x39<CR> Control Reg (0x00) = 0x00<CR> Control Reg (0x00) = 0x7F<CR> Control Reg (0x00) = 0x00<CR> Control Reg (0x00) = 0xFF<CR> Control Reg (0x00) = 0x74<CR> Control Reg (0x00) = 0xFF<CR> Control Reg (0x00) = 0xED<CR> Control Reg (0x00) = 0xC0<CR> Control Reg (0x00) = 0x39<CR> Control Reg (0x00) = 0x00<CR> Control Reg (0x00) = 0x7F<CR> Control Reg (0x00) = 0x00<CR> Control Reg (0x00) = 0xFF<CR> Control Reg (0x00) = 0x74<CR> Control Reg (0x00) = 0xFF<CR> Control Reg (0x00) = 0xED<CR> Control Reg (0x00) = 0xC0<CR> Control Reg (0x00) = 0x39<CR> Control Reg (0x00) = 0x00<CR> Control Reg (0x00) = 0x7F<CR> Edited April 29, 2025 by RR2021 Quote Share this post Link to post Share on other sites More sharing options...