一个稳定可靠的stm3 ic程序文档格式.docx

上传人:b****4 文档编号:6355753 上传时间: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

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__

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

i2c.c

I2c3tocommunicatewiththesensors

Author:

**********************************Includes***********************************/

#include<

stdio.h>

#include"

stm32l1xx.h"

i2c.h"

gpio.h"

log.h"

discover_board.h"

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);

SDA----------------------------------------*/

GPIO_InitStructure.GPIO_Pin=SENSORS_I2C_SDA_GPIO_PIN;

GPIO_PinAFConfig(SENSORS_I2C_SDA_GPIO_PORT,SENSORS_I2C_SDA_GPIO_PINSOURCE,SENSORS_I2C_AF);

GPIO_Init(SENSORS_I2C_SDA_GPIO_PORT,&

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_GenerateSTOP(SENSORS_I2C,ENABLE);

I2C_SoftwareResetCmd(SENSORS_I2C,ENABLE);

I2C_SoftwareResetCmd(SENSORS_I2C,DISABLE);

#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

WAIT_FOR_FLAG(I2C_FLAG_TXE,SET,I2Cx_FLAG_TIMEOUT,4);

/*Transmitthefirstaddressforwriteoperation*/

I2C_SendData(SENSORS_I2C,RegisterAddr);

while(i--)

{

WAIT_FOR_FLAG(I2C_FLAG_TXE,SET,I2Cx_FLAG_TIMEOUT,5);

/*Preparetheregistervaluetobesent*/

//I2C_SendData(SENSORS_I2C,*RegisterValue--);

I2C_SendData(SENSORS_I2C,*RegisterValue++);

}

WAIT_FOR_FLAG(I2C_FLAG_BTF,SET,I2Cx_FLAG_TIMEOUT,6);

/*Endtheconfigurationsequence*/

/*Returntheverifyingvalue:

0(Passed)or1(Failed)*/

returnresult;

unsignedlongSensors_I2C_ReadRegister(unsignedcharAddress,unsignedcharRegisterAddr,unsignedshortRegisterLen,unsignedchar*RegisterValue)

uint8_tbytesRemaining=RegisterLen;

WAIT_FOR_FLAG(I2C_FLAG_BUSY,RESET,I2Cx_LONG_TIMEOUT,7);

WAIT_FOR_FLAG(I2C_FLAG_SB,SET,I2Cx_FLAG_TIMEOUT,8);

WAIT_FOR_FLAG(I2C_FLAG_ADDR,SET,I2Cx_FLAG_TIMEOUT,9);

CLEAR_ADDR_BIT;

WAIT_FOR_FLAG(I2C_FLAG_TXE,SET,I2Cx_FLAG_TIMEOUT,10);

/*Transmittheregisteraddresstoberead*/

WAIT_FOR_FLAG(I2C_FLAG_TXE,SET,I2Cx_FLAG_TIMEOUT,11);

/*!

SendSTARTconditionasecondtime*/

WAIT_FOR_FLAG(I2C_FLAG_SB,SET,I2Cx_FLAG_TIMEOUT,12);

Sendaddressforread*/

1),I2C_Direction_Receiver);

WAIT_FOR_FLAG(I2C_FLAG_ADDR,SET,I2Cx_FLAG_TIMEOUT,13);

if(RegisterLen==1){

DisableAcknowledgment*/

I2C_AcknowledgeConfig(SENSORS_I2C,DISABLE);

SendSTOPCondition*/

/*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){

/*SetPOSbit*/

SENSORS_I2C->

CR1|=

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

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

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

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