I2C - IMU 6DOF
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2015-03-10 9:00 PM
Posted on March 11, 2015 at 05:00
Dear all,
I am doing a project that control a quadcopter using STM32F103. At this moment, I have done about the control of DC motor. However, my quad. is not stable when it takes off. I am going to use IMU 6DOF ( ADXL345 / ITG3200) to solve this problem. I have read a code of I2C library ( for AN2824 ) but it seems difficult to understand. I don't know clearly in this function: Status I2C_Read(I2C_TypeDef* I2Cx, uint8_t *buf,uint32_t nbyte, uint8_t SlaveAddress) Can you give me some ideas about that ? Thank you.
This discussion is locked. Please start a new topic to ask your question.
2 REPLIES 2
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2015-03-12 9:15 PM
Posted on March 13, 2015 at 05:15
I get stuck at
I2C_Send7bitAddress(I2C1,0xA6,I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
What problem is that ?
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2015-03-18 8:44 AM
Posted on March 18, 2015 at 16:44
*�?始化I2C1对外�?�线*/
static void I2C_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB, ENABLE );//使能与 I2C1 有关的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;//PB6-I2C1_SCL�?PB7-I2C1_SDA GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); } /*硬件�?ç½®I2C1*/ static void I2C_Mode_Config(void) { I2C_InitTypeDef I2C_InitStructure; I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ; //I2C �?ç½® I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = MPU_ADRESS; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = I2C_Speed; I2C_Cmd(I2C1,ENABLE);//使能 I2C1 I2C_Init(I2C1, &I2C_InitStructure);//I2C1 �?始化 I2C_AcknowledgeConfig(I2C1, ENABLE);//�?è®¸åº”ç”æ¨¡ï¿½? } /* * 函数�??:I2C_MPU6050_ByteWrite * �??è¿° :写一个å—节到I2C MPU6050寄å˜å™¨ä¸ * 输入 :-pBuffer 缓冲区指针 * -WriteAddr 接收数�?�的MPU6050寄å˜å™¨çš„地�?� * 输出 ï¼šæ— * 返回 ï¼šæ— * 调用 :内部调用 */ static void I2C_MPU_ByteWrite(u8 pBuffer, u8 WriteAddr) { while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));/*wait until I2C bus is not busy*///ç‰å¾…iic总线是�?�忙碌 I2C_GenerateSTART(I2C1, ENABLE);/* Send START condition *///�?��?开始�?�件 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/* Test on EV5 and clear it *///事件 I2C_Send7bitAddress(I2C1, MPU_ADRESS, I2C_Direction_Transmitter);/* Send MMA address for write *///�?��?设备�? while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));/* Test on EV6 and clear it *///事件 I2C_SendData(I2C1, WriteAddr);/* Send the MMA's Register address to write to *///�?��?设备寄å˜å™¨åœ°ï¿½?� while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/* Test on EV8 and clear it *///事件 I2C_SendData(I2C1, pBuffer);/* Send the byte to be written *///�?��?写入设备寄å˜å™¨çš„æ•°ï¿½?� while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/* Test on EV8 and clear it *///事件 I2C_GenerateSTOP(I2C1, ENABLE);/* Send STOP condition *///�?�æ¢ä¿¡ï¿½?� } /* * 函数�??:I2C_MMA_ByteRead * �??è¿° :从MMA寄å˜å™¨é‡Œï¿½?�读�?�一�?�数�?�。 * 输入 : -ReadAddr 接收数�?�的MMA寄å˜å™¨çš„地�?�。 * 输出 ï¼šæ— * 返回 :读�?�出的寄å˜å™¨æ•°ï¿½?� * 调用 :内部调用 */ void I2C_MPU_ByteRead(uint32_t* pBuffer, uint32_t ReadAddr, uint32_t NumByteToRead)//第一个�?�数是指针�?��?,读第一个地�?��?ï¿½åŠ 1, //第二个�?�数是寄å˜å™¨åœ°ï¿½?�,�?�需�?填入第一个地�?��?��?� //在读第二个地�?�,第三个�?�数是多少个8�?ï¼ŒæŒ‡é’ˆå¥½ç´¯åŠ { while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));//检测忙碌 I2C_GenerateSTART(I2C1, ENABLE);//开始信�?� while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//åº”ç” I2C_Send7bitAddress(I2C1, MPU_ADRESS, I2C_Direction_Transmitter);//�?��?设备地�?� while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//åº”ç” I2C_Cmd(I2C1, ENABLE);//使能iic I2C_SendData(I2C1, ReadAddr);//�?��?设备寄å˜å™¨åœ°ï¿½?� while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));//åº”ç” I2C_GenerateSTART(I2C1, ENABLE);//开始信�?� while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//åº”ç” I2C_Send7bitAddress(I2C1, MPU_ADRESS, I2C_Direction_Receiver);//�?��?设备地�?��?+1,读信�?� while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));//åº”ç” while(NumByteToRead) { if(NumByteToRead == 1)//如果就读一个一节 { I2C_AcknowledgeConfig(I2C1, DISABLE);//�?ï¿½åº”ç” I2C_GenerateSTOP(I2C1, ENABLE);//�?�æ¢ä¿¡ï¿½?� } if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))//åº”ç” { *pBuffer = I2C_ReceiveData(I2C1);//读出数�?ï¿½ä¼ ç»™æŒ‡é’ˆï¿½?��? pBuffer++;//指针�?��?地�?�+1 NumByteToRead--;//�?读的地�?�里�?�的数�?�个数-1 } } I2C_AcknowledgeConfig(I2C1, ENABLE);//�?ï¿½åº”ç” }