Jump to content
    

SPI однобайтовые команды проходят а из 3х байт не проходят

Коротко: пытаюсь наладить обмен данными по 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>


 

 

 

0.png

 

 

1.jpg

Edited by RR2021

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...