aux prises avec ce qui est probablement un morceau de code simple pour copier 2 octets reçus d'un esclave I2C dans un tableau afin que je puisse ensuite les convertir en INT et effectuer des calculs sur les données.
Ce code lit avec succès (selon mon analyseur I2C) 2 octets consécutifs à partir d'une adresse de registre sur un ADC 16 bits.
void ADC_Initialise( void )
{
_DINT() ; // disable all maskable interrupts
I2C_SCL_HIGH() ;
I2C_SCL_OUTPUT() ;
I2C_SDA_HIGH() ;
I2C_SDA_OUTPUT() ;
I2C_Write_Register_3B( ADC, 0x01, 0xC0, 0x83) ; // Write 2 bytes to ADC Config Register
for(i=0; i < 10000; i++);
I2C_Read_Register( ADC, 0x00 ); // Read the 2 byte ADC value
for(i=0; i < 10000; i++);
_EINT() ; // re-enable the interrupts
}
static unsigned char I2C_Read_Register( char Device_Address, char Register_Address )
{
unsigned char Value ;
I2CM_Start( ) ;
if( I2CM_Out( Device_Address << 1 ) ) //send write control byte + chip address
return 0 ;
else if( I2CM_Out( Register_Address ) ) //send register number
return 0 ;
I2CM_Start( ) ; // Restart
if( I2CM_Out(( Device_Address << 1 ) | 0x01 )) //send read control byte + chip address
return 0 ;
I2CM_In( &Value, 2 ) ; //RJ 6.8.19 input 2 byte ADC value to 'buf'
// return Value ; //rj placed after IC2M_In
I2CM_Stop( ) ;
return Value ; //rj placed after IC2M_Stop
}
static void I2CM_In( unsigned char* buf, int count )
{
unsigned char data ;
for( ; count--; ) // How do I store these 2 bytes in a char[] or INT
{
data = 0 ;
I2C_SDA_INPUT() ;
volatile unsigned int i = 0 ;
for( ; i < 8 ; ++i )
{
//Set Clock High
I2C_SCL_HIGH() ;
//shift the bit over
data <<= 1 ;
if( I2C_SDA_IS_HIGH() )
{
data |= 0x01 ;
}
//Set Clock Low
brief_pause( 0x04 ) ;
I2C_SCL_LOW() ;
}
//put the input data byte into the buffer, inc buffer pointer
*buf++ = data ;
//take sda to output ack
I2C_SDA_OUTPUT() ;
//Set Clock High
I2C_SCL_HIGH() ;
//Set Clock Low
brief_pause( 0x04 ) ;
I2C_SCL_LOW() ;
}
}
Donc, j'ai probablement besoin d'un tableau (unsigned char adcarray [2] pour collecter/stocker les lectures résultantes, alors j'ai essayé -
*buf++ = data ;
adcarray[] = data ;
adcarray[] = buf ;
« attendu une expression » signifie probablement que j'ai besoin d'une forme de boucle for pour remplir le tableau à chaque passage, même si la ligne *buf est déjà dans une boucle de compte 2.
Assistance appréciée (C en IAR sur MSP430 et ADS1115 ADC). Cordialement, Ralph
adcarray
ouValue
- vous avez omis les déclarations de ces variables. - person Chris Turner   schedule 07.08.2019Value
? Il doit contenir les 2 octets lus par 'I2CM_In. What's wrong with the content of
Value` ? Est-ce différent de ce que vous voyez dans votre analyseur ? - person Gerhardh   schedule 07.08.2019unsigned char Value;
Comment est-ce censé contenir 2 octets ? - person Gerhardh   schedule 07.08.2019buf
estValue
, qui n'alloue qu'un octet de mémoire. La valeur devrait probablement être un tableau ou un entier de 16 bits, et la fonctionI2C_Read_Register
devrait renvoyer un entier de 16 bits. Si vous placez un point d'arrêt à*buf++ = data ;
, voyez-vous la même chose que votre analyseur ? - person yhyrcanus   schedule 07.08.2019