可能需要一段简单的代码,将从I2C从设备接收到的2个字节复制到数组中,以便随后可以转换为INT并对数据进行数学运算。
根据我的I2C分析器,此代码成功读取了16位ADC上一个寄存器地址中的2个连续字节。
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() ;
}
}
因此,大概我然后需要一个数组(无符号char adcarray [2]来收集/存储结果读取,因此我尝试了-
*buf++ = data ;
adcarray[] = data ;
adcarray[] = buf ;
“期望表达式”大概意味着我需要某种形式的for循环来在每次通过时填充数组,即使* buf行已经在count 2循环内。
感谢您的协助(MSP430和ADS1115 ADC的IAR中为C)。 此致拉尔夫
答案 0 :(得分:0)
如果尝试使用I2CM_In函数将数据存储在另一个数组中,则说明使用的是错误的。
static void I2CM_In( unsigned char* buf, int count )
{
unsigned char data ;
for( ; count--; )
{
....
//put the input data byte into the buffer, inc buffer pointer
*buf++ = data ;
}
}
接收到的数据已经存储在缓冲区buf
中。
提供适合存储结果的缓冲区是您的工作。
static unsigned char I2C_Read_Register( char Device_Address, char Register_Address )
{
unsigned char Value ;
...
I2CM_In( &Value, 2 ) ; // << Value is 1 byte!
...
return Value ;
}
如果要读取16位寄存器,则不能将值作为unsigned char
返回。您必须使用能够容纳(至少)2个字节的数据类型。
通过告诉函数缓冲区为2个字节长,还会导致未定义的行为。
static uint16_t I2C_Read_Register( char Device_Address, char Register_Address )
{
uint16_t Value ;
...
I2CM_In( &Value, 2 ) ;
...
return Value ;
}
根据字节序,您可能还需要切换字节顺序:
static uint16_t I2C_Read_Register( char Device_Address, char Register_Address )
{
uint8_t tmp_Value[2] ;
...
I2CM_In( tmp_Value, 2 ) ;
uint16_t Value;
#if MSB_FIRST
Value = ((uint16_t)tmp_Value[0]) << 8 || tmp_Value[1];
#else // LSB_FIRST
Value = ((uint16_t)tmp_Value[1]) << 8 || tmp_Value[0];
#endif
...
return Value ;
}