一个稳定可靠的stm3 ic程序.docx

上传人:b****4 文档编号:3936687 上传时间:2023-05-06 格式:DOCX 页数:17 大小:16.76KB
下载 相关 举报
一个稳定可靠的stm3 ic程序.docx_第1页
第1页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第2页
第2页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第3页
第3页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第4页
第4页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第5页
第5页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第6页
第6页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第7页
第7页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第8页
第8页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第9页
第9页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第10页
第10页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第11页
第11页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第12页
第12页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第13页
第13页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第14页
第14页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第15页
第15页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第16页
第16页 / 共17页
一个稳定可靠的stm3 ic程序.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

一个稳定可靠的stm3 ic程序.docx

《一个稳定可靠的stm3 ic程序.docx》由会员分享,可在线阅读,更多相关《一个稳定可靠的stm3 ic程序.docx(17页珍藏版)》请在冰点文库上搜索。

一个稳定可靠的stm3 ic程序.docx

一个稳定可靠的stm3ic程序

/*********************************************************************

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|=

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2