一个稳定可靠的STM32 I2C程序.docx
- 文档编号:7075895
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:13
- 大小:16.82KB
一个稳定可靠的STM32 I2C程序.docx
《一个稳定可靠的STM32 I2C程序.docx》由会员分享,可在线阅读,更多相关《一个稳定可靠的STM32 I2C程序.docx(13页珍藏版)》请在冰豆网上搜索。
一个稳定可靠的STM32I2C程序
/*********************************************************************
File:
i2c.h
Purpose:
**********************************************************************/
#ifndef__I2C_H__
#define__I2C_H__
/******************************Includes*****************************/
/******************************Defines*******************************/
#defineSENSORS_I2CI2C2
#defineI2C_SPEED400000
#defineI2C_OWN_ADDRESS0x00
#defineI2C_Config()I2cMaster_Init();
/*****************************Prototypes*****************************/
voidI2cMaster_Init(void);
unsignedlongSensors_I2C_WriteRegister(unsignedcharAddress,unsignedcharRegisterAddr,unsignedshortRegisterLen,constunsignedchar*RegisterValue);
unsignedlongSensors_I2C_ReadRegister(unsignedcharAddress,unsignedcharRegisterAddr,unsignedshortRegisterLen,unsignedchar*RegisterValue);
intSensors_I2C_WriteRegister_swap(unsignedcharslave_addr,unsignedcharreg_addr,unsignedcharlen,unsignedchar*data_ptr);
intSensors_I2C_ReadRegister_swap(unsignedcharslave_addr,unsignedcharreg_addr,unsignedcharlen,unsignedchar*data_ptr);
intI2C_Reset_User();
#endif//__I2C_H__
/*******************************************************************************
File:
i2c.c
Purpose:
I2c3tocommunicatewiththesensors
Author:
**********************************Includes***********************************/
#include
#include"stm32l1xx.h"
#include"i2c.h"
#include"gpio.h"
#include"log.h"
#include"discover_board.h"
#include"main.h"
/*********************************Defines************************************/
#defineI2Cx_FLAG_TIMEOUT((uint32_t)900)
#defineI2Cx_LONG_TIMEOUT((uint32_t)(300*I2Cx_FLAG_TIMEOUT))
#defineSENSORS_I2C_SCL_GPIO_PORTGPIOB
#defineSENSORS_I2C_SCL_GPIO_CLKRCC_AHBPeriph_GPIOB
#defineSENSORS_I2C_SCL_GPIO_PINGPIO_Pin_10
#defineSENSORS_I2C_SCL_GPIO_PINSOURCEGPIO_PinSource10
#defineSENSORS_I2C_SDA_GPIO_PORTGPIOB
#defineSENSORS_I2C_SDA_GPIO_CLKRCC_AHBPeriph_GPIOB
#defineSENSORS_I2C_SDA_GPIO_PINGPIO_Pin_11
#defineSENSORS_I2C_SDA_GPIO_PINSOURCEGPIO_PinSource11
#defineSENSORS_I2C_RCC_CLKRCC_APB1Periph_I2C2
#defineSENSORS_I2C_AFGPIO_AF_I2C2
#defineWAIT_FOR_FLAG(flag,value,timeout,errorcode)I2CTimeout=timeout;\
while(I2C_GetFlagStatus(SENSORS_I2C,flag)!
=value){\
if((I2CTimeout--)==0)returnI2Cx_TIMEOUT_UserCallback(errorcode);\
}\
#defineCLEAR_ADDR_BITI2C_ReadRegister(SENSORS_I2C,I2C_Register_SR1);\
I2C_ReadRegister(SENSORS_I2C,I2C_Register_SR2);\
/*********************************Globals************************************/
/*********************************Prototypes*********************************/
/*******************************Function************************************/
staticuint32_tI2Cx_TIMEOUT_UserCallback(charvalue);
voidI2cMaster_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
I2C_InitTypeDefI2C_InitStructure;
/*EnableI2Cxclock*/
RCC_APB1PeriphClockCmd(SENSORS_I2C_RCC_CLK,ENABLE);
/*EnableI2CGPIOclock*/
RCC_AHBPeriphClockCmd(SENSORS_I2C_SCL_GPIO_CLK|SENSORS_I2C_SDA_GPIO_CLK,ENABLE);
/*ConfigureI2Cxpin:
SCL----------------------------------------*/
GPIO_InitStructure.GPIO_Pin=SENSORS_I2C_SCL_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
/*ConnectpinstoPeriph*/
GPIO_PinAFConfig(SENSORS_I2C_SCL_GPIO_PORT,SENSORS_I2C_SCL_GPIO_PINSOURCE,SENSORS_I2C_AF);
GPIO_Init(SENSORS_I2C_SCL_GPIO_PORT,&GPIO_InitStructure);
/*ConfigureI2Cxpin:
SDA----------------------------------------*/
GPIO_InitStructure.GPIO_Pin=SENSORS_I2C_SDA_GPIO_PIN;
/*ConnectpinstoPeriph*/
GPIO_PinAFConfig(SENSORS_I2C_SDA_GPIO_PORT,SENSORS_I2C_SDA_GPIO_PINSOURCE,SENSORS_I2C_AF);
GPIO_Init(SENSORS_I2C_SDA_GPIO_PORT,&GPIO_InitStructure);
I2C_DeInit(SENSORS_I2C);
I2C_InitStructure.I2C_Mode=I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1=I2C_OWN_ADDRESS;
I2C_InitStructure.I2C_Ack=I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed=I2C_SPEED;
/*EnabletheI2Cperipheral*/
I2C_Cmd(SENSORS_I2C,ENABLE);
/*InitializetheI2Cperipheral*/
I2C_Init(SENSORS_I2C,&I2C_InitStructure);
}
/**
*@briefBasicmanagementofthetimeoutsituation.
*@paramNone.
*@retvalNone.
*/
staticuint32_tI2Cx_TIMEOUT_UserCallback(charvalue)
{
/*ThefollowingcodeallowsI2Cerrorrecoveryandreturntonormalcommunication
iftheerrorsourcedoesn'tstillexist(ie.hardwareissue..)*/
I2C_InitTypeDefI2C_InitStructure;
I2C_GenerateSTOP(SENSORS_I2C,ENABLE);
I2C_SoftwareResetCmd(SENSORS_I2C,ENABLE);
I2C_SoftwareResetCmd(SENSORS_I2C,DISABLE);
I2C_DeInit(SENSORS_I2C);
I2C_InitStructure.I2C_Mode=I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1=I2C_OWN_ADDRESS;
I2C_InitStructure.I2C_Ack=I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed=I2C_SPEED;
/*EnabletheI2Cperipheral*/
I2C_Cmd(SENSORS_I2C,ENABLE);
/*InitializetheI2Cperipheral*/
I2C_Init(SENSORS_I2C,&I2C_InitStructure);
#ifdefUser_debug
MPL_LOGI("I2CRestarted.\n");
#endif
return1;
}
intI2C_Reset_User()
{
returnI2Cx_TIMEOUT_UserCallback(0);
}
/**
*@briefWritesaBytetoagivenregistertothesensorsthroughthe
controlinterface(I2C)
*@paramRegisterAddr:
Theaddress(location)oftheregistertobewritten.
*@paramRegisterValue:
theBytevaluetobewrittenintodestinationregister.
*@retval0ifcorrectcommunication,elsewrongcommunication
*/
unsignedlongSensors_I2C_WriteRegister(unsignedcharAddress,unsignedcharRegisterAddr,unsignedshortRegisterLen,constunsignedchar*RegisterValue)
{
uint32_tresult=0;
uint32_ti=RegisterLen;
__IOuint32_tI2CTimeout=I2Cx_LONG_TIMEOUT;
//RegisterValue=RegisterValue+(RegisterLen-1);
/*Waitforthebusyflagtobecleared*/
WAIT_FOR_FLAG(I2C_FLAG_BUSY,RESET,I2Cx_LONG_TIMEOUT,1);
/*Starttheconfigsequence*/
I2C_GenerateSTART(SENSORS_I2C,ENABLE);
/*Waitforthestartbittobeset*/
WAIT_FOR_FLAG(I2C_FLAG_SB,SET,I2Cx_FLAG_TIMEOUT,2);
/*Transmittheslaveaddressandenablewritingoperation*/
I2C_Send7bitAddress(SENSORS_I2C,(Address<<1),I2C_Direction_Transmitter);
/*Waitforaddressbittobeset*/
WAIT_FOR_FLAG(I2C_FLAG_ADDR,SET,I2Cx_FLAG_TIMEOUT,3);
/*cleartheADDRinterruptbit-thisisdonebyreadingSR1andSR2*/
CLEAR_ADDR_BIT
/*Waitforaddressbittobeset*/
WAIT_FOR_FLAG(I2C_FLAG_TXE,SET,I2Cx_FLAG_TIMEOUT,4);
/*Transmitthefirstaddressforwriteoperation*/
I2C_SendData(SENSORS_I2C,RegisterAddr);
while(i--)
{
/*Waitforaddressbittobeset*/
WAIT_FOR_FLAG(I2C_FLAG_TXE,SET,I2Cx_FLAG_TIMEOUT,5);
/*Preparetheregistervaluetobesent*/
//I2C_SendData(SENSORS_I2C,*RegisterValue--);
I2C_SendData(SENSORS_I2C,*RegisterValue++);
}
/*Waitforaddressbittobeset*/
WAIT_FOR_FLAG(I2C_FLAG_BTF,SET,I2Cx_FLAG_TIMEOUT,6);
/*Endtheconfigurationsequence*/
I2C_GenerateSTOP(SENSORS_I2C,ENABLE);
/*Returntheverifyingvalue:
0(Passed)or1(Failed)*/
returnresult;
}
unsignedlongSensors_I2C_ReadRegister(unsignedcharAddress,unsignedcharRegisterAddr,unsignedshortRegisterLen,unsignedchar*RegisterValue)
{
uint32_tresult=0;
uint8_tbytesRemaining=RegisterLen;
__IOuint32_tI2CTimeout=I2Cx_LONG_TIMEOUT;
/*Waitforthebusyflagtobecleared*/
WAIT_FOR_FLAG(I2C_FLAG_BUSY,RESET,I2Cx_LONG_TIMEOUT,7);
/*Starttheconfigsequence*/
I2C_GenerateSTART(SENSORS_I2C,ENABLE);
/*Waitforthestartbittobeset*/
WAIT_FOR_FLAG(I2C_FLAG_SB,SET,I2Cx_FLAG_TIMEOUT,8);
/*Transmittheslaveaddressandenablewritingoperation*/
I2C_Send7bitAddress(SENSORS_I2C,(Address<<1),I2C_Direction_Transmitter);
/*Waitforthestartbittobeset*/
WAIT_FOR_FLAG(I2C_FLAG_ADDR,SET,I2Cx_FLAG_TIMEOUT,9);
/*cleartheADDRinterruptbit-thisisdonebyreadingSR1andSR2*/
CLEAR_ADDR_BIT;
/*Waitforaddressbittobeset*/
WAIT_FOR_FLAG(I2C_FLAG_TXE,SET,I2Cx_FLAG_TIMEOUT,10);
/*Transmittheregisteraddresstoberead*/
I2C_SendData(SENSORS_I2C,RegisterAddr);
/*Waitforaddressbittobeset*/
WAIT_FOR_FLAG(I2C_FLAG_TXE,SET,I2Cx_FLAG_TIMEOUT,11);
/*!
I2C_GenerateSTART(SENSORS_I2C,ENABLE); /*Waitforthestartbittobeset*/ WAIT_FOR_FLAG(I2C_FLAG_SB,SET,I2Cx_FLAG_TIMEOUT,12); /*! I2C_Send7bitAddress(SENSORS_I2C,(Address<<1),I2C_Direction_Receiver); /*Waitforthestartbittobeset*/ WAIT_FOR_FLAG(I2C_FLAG_ADDR,SET,I2Cx_FLAG_TIMEOUT,13); if(RegisterLen==1){ /*! I2C_AcknowledgeConfig(SENSORS_I2C,DISABLE); /*cleartheADDRinterruptbit-thisisdonebyreadingSR1andSR2*/ CLEAR_ADDR_BIT; /*! I2C_GenerateSTOP(SENSORS_I2C,ENABLE); /*WaitfortheRXNEbittobeset*/ WAIT_FOR_FLAG(I2C_FLAG_RXNE,SET,I2Cx_FLAG_TIMEOUT,14); //bytesRemaining--; //RegisterValue[bytesRemaining]=I2C_ReceiveData(SENSORS_I2C); RegisterValue[0]=I2C_ReceiveData(SENSORS_I2C); }elseif(RegisterLen==2){ /*! I2C_AcknowledgeConfig(SENSORS_I2C,DISABLE); /*SetPOSbit*/ SENSORS_I2C->CR1|
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一个稳定可靠的STM32 I2C程序 一个 稳定 可靠 STM32 I2C 程序