簡體   English   中英

STM32F4 ADXL345 I2C通訊

[英]STM32F4 ADXL345 I2C communication

我已經開始通過檢查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();

}

傳感器的文檔說:

設備的7位I2C地址為0x1D

因此,在您的代碼中,您應該編寫:

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

這是因為ST HAL認為左移了7位地址。

該文檔還說:

可以通過將SDO / ALT地址接地來選擇備用I2C地址0x53(緊隨其后的R / W位)

如果您的硬件屬於這種情況,請將代碼更改為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM