STM32F4 ADXL345 I2C通信

问题描述 投票:0回答:1

我已经开始通过检查adxl345传感器来研究I2C通信。我编写了基本代码来测试我的代码是否有效。根据ADXL345技术文档,0x00寄存器应返回设备ID,即0xE5。当我尝试此寄存器时,返回值为0.此应用程序应该是基本的,但我想,我仍然遗漏了一些东西。除了我的经验,我还在这个社区搜索关于adxl345问题,但我找不到答案。如果你引导我解决这个问题,我将非常感激。我附上了我的代码。

void SysTick_Handler(void){
   HAL_IncTick();
   HAL_SYSTICK_IRQHandler();}
   void SysClockEn();

/*System Configuration PA8-> I2C Clock , PC9-> I2C Data Lane*/  
 int main(){ 

SysClockEn();
HAL_Init();


/*------GPIO Configuration For I2C3------*/


__GPIOA_CLK_ENABLE();
GPIO_InitTypeDef *ptrB6,addrB6;
ptrB6 = &addrB6;
ptrB6->Alternate = GPIO_AF4_I2C3;
ptrB6->Pin = GPIO_PIN_8;
ptrB6->Pull = GPIO_NOPULL;
ptrB6->Speed =GPIO_SPEED_FREQ_HIGH;
ptrB6->Mode = GPIO_MODE_AF_OD;

HAL_GPIO_Init(GPIOA,ptrB6);

__GPIOC_CLK_ENABLE();
GPIO_InitTypeDef *ptrC,addrC;
ptrC = &addrC;
ptrC->Alternate =GPIO_AF4_I2C3;
ptrC->Mode =GPIO_MODE_AF_OD;
ptrC->Pin =GPIO_PIN_9;
ptrC->Pull =GPIO_NOPULL;
ptrC->Speed =GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC,ptrC);
/*-----I2C Configurations-----*/

//__HAL_RCC_I2C3_CLK_ENABLE();

__I2C3_CLK_ENABLE();
I2C_HandleTypeDef *ptrI2C,addrI2C;

ptrI2C = &addrI2C;

ptrI2C->Instance = I2C3;
ptrI2C->Init.ClockSpeed = 100000; //100Khz
ptrI2C->Init.DutyCycle = I2C_DUTYCYCLE_2;
ptrI2C->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
ptrI2C->Mode =HAL_I2C_MODE_MASTER;

//ptrI2C->Init.GeneralCallMode =I2C_GENERALCALL_DISABLE;
//ptrI2C->Init.NoStretchMode=I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(ptrI2C);
__HAL_I2C_ENABLE(ptrI2C);


uint8_t data=0x00;

unsigned char buffer[2];
uint8_t *buf;

unsigned char pt;
uint32_t ptr;
uint8_t val
while(1){
 val=HAL_I2C_IsDeviceReady(ptrI2C,0x1D,0xe5,1000);
 pt=HAL_I2C_GetState(ptrI2C);
 //HAL_I2C_Master_Transmit(ptrI2C,0x1d,0x00,1,0);
 //HAL_I2C_Master_Receive(ptrI2C,0x1d,buffer,1,100);
 //HAL_Delay(2);
 HAL_I2C_Mem_Read(ptrI2C,SensAddr,0x00,1,buffer,2,1000);
 ptr=HAL_I2C_GetError(ptrI2C);
}

}

void SysClockEn(){

__PWR_CLK_ENABLE();

}
sensor i2c serial-communication stm32f4discovery
1个回答
1
投票

传感器的文档说:

器件的7位I2C地址为0x1D

所以在你的代码中你应该写:

#define SensAddr (0x1D<<1)
...
HAL_I2C_Mem_Read(ptrI2C,SensAddr,0x00,1,buffer,2,1000);
...

这是因为ST HAL认为7位地址左移。

文件还说:

可以通过将SDO / ALT ADDRESS接地来选择0x53的备用I2C地址(后跟R / W位)

如果您的硬件属于这种情况,请将代码更改为:

#define SensAddr (0x53<<1)
...
HAL_I2C_Mem_Read(ptrI2C,SensAddr,0x00,1,buffer,2,1000);
...
© www.soinside.com 2019 - 2024. All rights reserved.