mandare funzioni invece che indirizzi

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Montanaro
Prode Principiante
Messaggi: 151
Iscrizione: lunedì 16 aprile 2018, 20:56
Desktop: ubuntu
Distribuzione: linux embedded 3.10.17
Sesso: Maschile

mandare funzioni invece che indirizzi

Messaggio da Montanaro » mercoledì 20 novembre 2019, 14:22

Devo scrivere su uno strumento tra i2c.

Ho le istruzioni per scrivere su indirizzi, esempio:

Codice: Seleziona tutto

[i]
  struct erglass_i2cwrite s_i2cwrite;
 s_i2cwrite.deviceaddress = value;
        s_i2cwrite.deviceconfiguration = 0x01;
        s_i2cwrite.registeraddress = 0x20;
        s_i2cwrite.numdata = 4;
        s_i2cwrite.data[0] = 0x21;
        s_i2cwrite.data[1] = 0x22;
        s_i2cwrite.data[2] = 0x23;
        s_i2cwrite.data[3] = 0x24;
        ioctl(m_fdeRGlass, cmd, &s_i2cwrite);

[/i]
come faccio ad inviare funzioni ? tipo:

Codice: Seleziona tutto

[i]saddr = VL53L1X_ADDR;

	saddr = vl53l1x_start_ranging(saddr);
	saddr = vl53l1x_wait_for_data_ready(saddr);
	saddr = vl53l1x_clear_interrupt(saddr);
	saddr = vl53l1x_stop_ranging(saddr);
	saddr = vl53l1x_write_byte(saddr, VL53L1X_VHV_CONFIG_TIMEOUT_MACROP_LOOP_BOUND, 0x09);	// two bounds VHV
	saddr = vl53l1x_write_byte(saddr, 0x0B, 0x00);											// start VHV from the previous temperature

	// modalità di funzionamento: short distance mode
	saddr = vl53l1x_write_byte(saddr, VL53L1X_PHASECAL_CONFIG_TIMEOUT_MACROP, 0x14);
[/i]
Ultima modifica di Montanaro il martedì 26 novembre 2019, 15:53, modificato 4 volte in totale.

Montanaro
Prode Principiante
Messaggi: 151
Iscrizione: lunedì 16 aprile 2018, 20:56
Desktop: ubuntu
Distribuzione: linux embedded 3.10.17
Sesso: Maschile

Re: mandare funzioni invece che indirizzi

Messaggio da Montanaro » mercoledì 20 novembre 2019, 14:44

questa è la teoria che ho trovato:
https://www.linux.it/~rubini/docs/i2c/i2c.html

Montanaro
Prode Principiante
Messaggi: 151
Iscrizione: lunedì 16 aprile 2018, 20:56
Desktop: ubuntu
Distribuzione: linux embedded 3.10.17
Sesso: Maschile

Re: mandare funzioni invece che indirizzi

Messaggio da Montanaro » martedì 26 novembre 2019, 15:49

ci sto capendo qualcosa finalmente :)
ma sono ancora molto lontano :(

le funzioni sopra sfruttano una libreria standard linux che è : i2c.h e i2c.c della st

questa contiene due funzioni i2c_rx e i2c_tx e sono queste che vanno sostituite con il comando ioctl :O
Ultima modifica di Montanaro il martedì 26 novembre 2019, 15:50, modificato 1 volta in totale.

Montanaro
Prode Principiante
Messaggi: 151
Iscrizione: lunedì 16 aprile 2018, 20:56
Desktop: ubuntu
Distribuzione: linux embedded 3.10.17
Sesso: Maschile

Re: mandare funzioni invece che indirizzi

Messaggio da Montanaro » martedì 26 novembre 2019, 15:50

Codice: Seleziona tutto

/ write defined number bytes to slave memory starting with defined index
//------------------------------------------------------------------------------
unsigned char i2c_tx(unsigned char addr, unsigned short idx, unsigned char len, unsigned char *buf)
{
	set_tout_ms(50);

	//--------------- BUSY? -> STOP request ---------------------
	while ((I2C1->SR3 & 2) && tout())								// Wait while the bus is busy
	{
		I2C1->CR2 |= 2;												// STOP = 1, generate stop
		while ((I2C1->CR2 & 2) && tout()) ;							// wait until stop is performed
	}
	
	//--------------- Start communication -----------------------
	I2C1->CR2 |= 1;													// START = 1, generate start
	while (((I2C1->SR1 & 1) == 0) && tout()) ;						// Wait for start bit detection (SB)
	dead_time();													// SB clearing sequence

	//------------------ Address send ---------------------------
	if (tout())
		I2C1->DR = addr & 0xFE;										// Send 7-bit device address & Write (R/W = 0)

	while (!(I2C1->SR1 & 2) && tout()) ;							// Wait for address ack (ADDR)
	dead_time();													// ADDR clearing sequence
	I2C1->SR3;

	//------------ Register index/Command send -------------------
	if (addr & 0x40)												// If addr is 0x52 then index is for VL53L1X (16 bit) otherwise if addr is 0x30 then index is for IIS2DLPC (8 bit), 
	{
		while (!(I2C1->SR1 & 0x80) && tout()) ;						// Wait for TxE
		if (tout())
			I2C1->DR = (unsigned char)(idx >> 8);					// send register index MSB
	}

	while (!(I2C1->SR1 & 0x80) && tout()) ;							// Wait for TxE
	if (tout())
		I2C1->DR = (unsigned char)idx;								// send register index LSB

	// ------------------- Data Transmit -------------------------
	while (len--)
	{																// write data loop start
		while (!(I2C1->SR1 & 0x80) && tout()) ;						// test EV8 - wait for TxE
		I2C1->DR = *(buf++);										// send next data byte
	}																// write data loop end

	while (((I2C1->SR1 & 0x84) != 0x84) && tout()) ;				// Wait for TxE & BTF
	dead_time();													// clearing sequence

	//----------------- All Data Transmitted ---------------------
	I2C1->CR2 |= 2;													// generate stop here (STOP = 1)
	while ((I2C1->CR2 & 2) && tout()) ;								// wait until stop is performed  

	return tout_expired();
}

Montanaro
Prode Principiante
Messaggi: 151
Iscrizione: lunedì 16 aprile 2018, 20:56
Desktop: ubuntu
Distribuzione: linux embedded 3.10.17
Sesso: Maschile

Re: mandare funzioni invece che indirizzi

Messaggio da Montanaro » martedì 10 dicembre 2019, 8:38

avrei trovato quel che mi serve ma la ST non ha rilasciata il software:
https://my.st.com/content/my_st_com/en/ ... l#overview
:(

Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 6 ospiti