gpt4 book ai didi

c - 存储来自 I2C 从机的 2 个字节

转载 作者:行者123 更新时间:2023-11-30 16:14:49 25 4
gpt4 key购买 nike

正在努力编写一段简单的代码,将从 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() ;
}
}

所以,大概我需要一个数组(unsigned char adcarray [2] 来收集/存储结果读取,所以我尝试了 -

*buf++ = data ;

adcarray[] = data ;

adcarray[] = buf ;

“需要一个表达式”大概意味着我需要某种形式的 for 循环来在每次传递时填充数组,即使 *buf 行已经位于 count 2 循环内。

感谢帮助(MSP430 和 ADS1115 ADC 上的 IAR 中的 C)。问候,拉尔夫

最佳答案

如果您尝试使用 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 ;
}

关于c - 存储来自 I2C 从机的 2 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57390321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com