已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/h文件#ifndef _iic_h_#define _iic_h_/* Includes -*/#include stm32f10x.h/* Exported types -*/typedef enum i2c_result NO_ERR = 0, TIMEOUT = 1, BUS_BUSY = 2, SEND_START_ERR = 3, ADDR_MATCH_ERR = 4, ADDR_HEADER_MATCH_ERR = 5, DATA_TIMEOUT = 6, WAIT_COMM = 7, STOP_TIMEOUT = 8I2C_Result;typedef enum i2c_state COMM_DONE = 0, / done successfully COMM_PRE = 1, COMM_IN_PROCESS = 2, CHECK_IN_PROCESS = 3, COMM_EXIT = 4 / exit since failure I2C_STATE;extern I2C_STATE i2c_comm_state;extern vu8 MasterReceptionComplete;extern vu8 MasterTransitionComplete; extern vu8 WriteComplete;extern vu8 SlaveReceptionComplete;extern vu8 SlaveTransitionComplete;void I2C_Comm_Init(I2C_TypeDef* I2Cx, u32 I2C_Speed, u16 I2C_Addr);void I2C_Comm_MasterWrite(I2C_TypeDef* I2Cx, u16 slave_addr, u32 offset, u8* pBuffer, u32 length);void I2C_Comm_SlaveRead(I2C_TypeDef* I2Cx, u8* pBuffer, u32 length);void I2C_Comm_MasterRead(I2C_TypeDef* I2Cx, u16 slave_addr, u32 offset, u8* pBuffer, u32 length);void I2C_Comm_SlaveWrite(I2C_TypeDef* I2Cx, u8* pBuffer, u32 length);void i2c1_evt_isr(void);void i2c1_err_isr(void);void i2c2_evt_isr(void);void i2c2_err_isr(void);/c文件#endif / _iic_h_#include iic.h/* specified by user */#define I2C_REMAP/#define SLAVE_10BIT_ADDRESS/* specify by user */#define Transmitter 0x00#define Receiver 0x01#define FALSE 0#define TRUE 1static vu8 Direction = Transmitter;static u16 SlaveADDR;static u32 TxLength,RxLength;static u32 DeviceOffset=0xffffffff;static u8* pTxBuffer1;static u8* pTxBuffer2;static u8* pRxBuffer1;static u8* pRxBuffer2;static u8 check_begin = FALSE;vu8 MasterReceptionComplete = 0;vu8 MasterTransitionComplete = 0; / to indicat masters send processvu8 SlaveReceptionComplete =0;vu8 SlaveTransitionComplete =0;vu8 WriteComplete = 0; / to indicat targets internal write process/*P-V operation on I2C1 or I2C2*/static vu8 PV_flag_1;static vu8 PV_flag_2;I2C_STATE i2c_comm_state;void I2C_Comm_Init(I2C_TypeDef* I2Cx, u32 I2C_Speed, u16 I2C_Addr)/* GPIO configuration and clock enable */ GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); if(I2Cx = I2C1) #ifdef I2C_REMAP GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;#else GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;#endif RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); else if (I2Cx = I2C2) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10| GPIO_Pin_11; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); /* I2C periphral configuration */ I2C_DeInit(I2Cx); I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; / fixed I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; / fixed I2C_InitStructure.I2C_OwnAddress1 = I2C_Addr; / user parameter I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; / fixed#ifdef SLAVE_10BIT_ADDRESS I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_10bit; / user define#else I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;#endif I2C_InitStructure.I2C_ClockSpeed = I2C_Speed; / user parameter I2C_Cmd(I2Cx, ENABLE); I2C_Init(I2Cx, &I2C_InitStructure); /* I2C NVIC configuration */ /* 1 bit for pre-emption priority, 3 bits for subpriority */ /NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);if(I2Cx = I2C1) NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn ; else NVIC_InitStructure.NVIC_IRQChannel = I2C2_EV_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); if(I2Cx = I2C1) NVIC_InitStructure.NVIC_IRQChannel = I2C1_ER_IRQn; else NVIC_InitStructure.NVIC_IRQChannel = I2C2_ER_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);/* Function Name : I2C_Comm_MasterWrite* Description : write a block of data to slave devices.* Input : - I2Cx : the I2C port from which mcu send data out.* - slave_addr : target slave* - offset : the internal memory of target slave to place data* if special value : no internal memory space of slave* - pBuffer : pointer to the data ready to send* - length : number of bytes to send.* Output : None* Return : None*/void I2C_Comm_MasterWrite(I2C_TypeDef* I2Cx, u16 slave_addr, u32 offset, u8* pBuffer, u32 length) /* PV operation */ if (I2Cx = I2C1) if (PV_flag_1 !=0) return; PV_flag_1 |=1; if (PV_flag_1 !=1) return; PV_flag_1 = 3; else if (PV_flag_2 !=0) return; PV_flag_2 |=1; if (PV_flag_2 !=1) return; PV_flag_2 = 3; /* enter rountine safely */ /*initialize static parameter*/ Direction = Transmitter; MasterTransitionComplete = 0; /*initialize static parameter according to input parameter*/ SlaveADDR = slave_addr; TxLength = length; DeviceOffset = offset; if (I2Cx = I2C1) pTxBuffer1 = pBuffer; else pTxBuffer2 = pBuffer; /* global state variable i2c_comm_state */ i2c_comm_state = COMM_PRE; I2C_AcknowledgeConfig(I2Cx, ENABLE); I2C_ITConfig(I2Cx, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, ENABLE); /* Send START condition */ if(I2C1-CR1 & 0x200) I2C1-CR1 &= 0xFDFF; I2C_GenerateSTART(I2Cx, ENABLE);/* Function Name : I2C_Comm_MasterRead* Description : read a block of data from slave devices.* Input : - I2Cx : the I2C port from which mcu send data out.* - slave_addr : target slave* - offset : the internal memory of target slave to place data* if special value : no internal memory space of slave* - pBuffer : pointer to the data ready to send* - length : number of bytes to send.* Output : None* Return : None*/void I2C_Comm_MasterRead(I2C_TypeDef* I2Cx, u16 slave_addr, u32 offset, u8* pBuffer, u32 length) /* PV operation */ if (I2Cx = I2C1) if (PV_flag_1 !=0) return; PV_flag_1 |=1; if (PV_flag_1 !=1) return; PV_flag_1 = 3; else if (PV_flag_2 !=0) return; PV_flag_2 |=1; if (PV_flag_2 !=1) return; PV_flag_2 = 3; /* enter rountine safely */ /*initialize static parameter*/ Direction = Receiver; MasterReceptionComplete = 0; /*initialize static parameter according to input parameter*/ SlaveADDR = slave_addr; RxLength = length; DeviceOffset = offset; if (I2Cx = I2C1) pRxBuffer1 = pBuffer; else pRxBuffer2 = pBuffer; /* global state variable i2c_comm_state */ i2c_comm_state = COMM_PRE; I2C_AcknowledgeConfig(I2Cx, ENABLE); I2C_ITConfig(I2Cx, I2C_IT_EVT | I2C_IT_ERR , ENABLE);/only SB int allowed /* Send START condition */ if(I2C1-CR1 & 0x200) I2C1-CR1 &= 0xFDFF; I2C_GenerateSTART(I2Cx, ENABLE);/* Function Name : I2C_Comm_SlaveRead* Description : receive a block of data from the master.* Input : - I2Cx : the I2C port from which mcu read data in.* - pBuffer : rams location to locate the received data* - length : number of bytes to receive.* Output : None* Return : None*/void I2C_Comm_SlaveRead(I2C_TypeDef* I2Cx, u8* pBuffer, u32 length) /* PV operation */ if (I2Cx = I2C1) if (PV_flag_1 !=0) return; PV_flag_1 |=1; if (PV_flag_1 !=1) return; PV_flag_1 = 3; else if (PV_flag_2 !=0) return; PV_flag_2 |=1; if (PV_flag_2 !=1) return; PV_flag_2 = 3; /* enter rountine safely */ SlaveReceptionComplete = 0; RxLength = length; if (I2Cx = I2C1) pRxBuffer1 = pBuffer; else pRxBuffer2 = pBuffer; /* global state variable i2c_comm_state */ i2c_comm_state = COMM_PRE; I2C_AcknowledgeConfig(I2Cx, ENABLE); I2C_ITConfig(I2Cx, I2C_IT_EVT |I2C_IT_ERR , ENABLE); / ADDR BTF only/* Function Name : I2C_Comm_SlaveWrite* Description : send a block of data out to the master.* Input : - I2Cx : the I2C port from which mcu send data out.* - pBuffer : rams location to locate the data to be send* - length : number of bytes to receive.* Output : None* Return : None*/void I2C_Comm_SlaveWrite(I2C_TypeDef* I2Cx, u8* pBuffer, u32 length) /* PV operation */ if (I2Cx = I2C1) if (PV_flag_1 !=0) return; PV_flag_1 |=1; if (PV_flag_1 !=1) return; PV_flag_1 = 3; else if (PV_flag_2 !=0) return; PV_flag_2 |=1; if (PV_flag_2 !=1) return; PV_flag_2 = 3; /* enter rountine safely */ SlaveTransitionComplete =0; TxLength = length; if (I2Cx = I2C1) pTxBuffer1 = pBuffer; else pTxBuffer2 = pBuffer; /* global state variable i2c_comm_state */ i2c_comm_state = COMM_PRE; I2C_AcknowledgeConfig(I2Cx, ENABLE); I2C_ITConfig(I2Cx, I2C_IT_EVT |I2C_IT_ERR, ENABLE); / ADDR BTF onlyvoid i2c1_evt_isr() switch (I2C_GetLastEvent(I2C1) /* Master Invoke*/ case I2C_EVENT_MASTER_MODE_SELECT: /* EV5 */ / MSL SB BUSY 30001 if(!check_begin) i2c_comm_state = COMM_IN_PROCESS; if (Direction = Receiver) if (DeviceOffset != 0xffffffff) I2C_Send7bitAddress(I2C1, SlaveADDR, I2C_Direction_Transmitter); else /* Send slave Address for read */ I2C_Send7bitAddress(I2C1, SlaveADDR, I2C_Direction_Receiver); else /* Send slave Address for write */ I2C_Send7bitAddress(I2C1, SlaveADDR, I2C_Direction_Transmitter); I2C_ITConfig(I2C1, I2C_IT_BUF , ENABLE);/also TxE int allowed break; /* Master Receiver events */ case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED: /* EV6 */ / MSL BUSY ADDR 0x30002 if (RxLength = 1) /* Disable I2C1 acknowledgement */ I2C_AcknowledgeConfig(I2C1, DISABLE); /* Send I2C1 STOP Condition */ I2C_GenerateSTOP(I2C1, ENABLE); break; case I2C_EVENT_MASTER_BYTE_RECEIVED: /* EV7 */ / MSL BUSY RXNE 0x30040 /* Store I2C1 received data */ *pRxBuffer1+ = I2C_ReceiveData (I2C1); RxLength-; /* Disable ACK and send I2C1 STOP condition before receiving the last data */ if (RxLength = 1) /* Disable I2C1 acknowledgement */ I2C_AcknowledgeConfig(I2C1, DISABLE); /* Send I2C1 STOP Condition */ I2C_GenerateSTOP(I2C1, ENABLE); if (RxLength = 0) MasterReceptionComplete = 1; i2c_comm_state = COMM_DONE; PV_flag_1 = 0; break; /* Master Transmitter events */ case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED: /* EV8 just after EV6 */ /BUSY, MSL, ADDR, TXE and TRA 0x70082 if (check_begin) check_begin = FALSE; WriteComplete = 1; i2c_comm_state = COMM_DONE; I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF |I2C_IT_ERR, DISABLE); I2C_GenerateSTOP(I2C1, ENABLE); PV_flag_1 = 0; break; if (DeviceOffset != 0xffffffff) I2C_SendData(I2C1, DeviceOffset); else I2C_SendData(I2C1, *pTxBuffer1+); TxLength-; break; case I2C_EVENT_MASTER_BYTE_TRANSMITTING: /* EV8 */ /TRA, BUSY, MSL, TXE 0x70080 if (Direction = Receiver) DeviceOffset = 0xffffffff; / enter read-phase 2 (the same as no memory space) I2C_ITConfig(I2C1, I2C_IT_BUF , DISABLE); while (I2C1-CR1 & 0x200) = 0x200); I2C_GenerateSTART(I2C1, ENABLE); break; if (TxLength 0) I2C_SendData(I2C1, *pTxBuffer1+); TxLength-; /* Disable the I2C_IT_BUF interrupt after sending the last buffer data (last EV8) to no allow a new interrupt with TxE and only BTF could generate it */ else if(TxLength = 0) I2C_ITConfig(I2C1, I2C_IT_BUF, DISABLE); I2C_GenerateSTOP(I2C1, ENABLE); break; case I2C_EVENT_MASTER_BYTE_TRANSMITTED: /* EV8-2 */ /TRA, BUSY, MSL, TXE and BTF 0x70084 if (Direction = Transmitter) MasterTransitionComplete = 1; I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF, DISABLE); / enable AF and SB and ADDR interrupt I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_ERR, ENABLE); check_begin = TRUE; i2c_comm_state = CHECK_IN_PROCESS; /while (I2C1-CR1 & 0x200) = 0x200); if(I2C1-CR1 & 0x200) I2C1-CR1 &= 0xFDFF; I2C_GenerateSTART(I2C1, ENABLE); break; else break; /* Slave Transmitter Events */ case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED: /* EV1 */ /TRA, BUSY, TXE and ADDR 0x60082 i2c_comm_state = COMM_IN_PROCESS; I2C_SendData(I2C1, *pTxBuffer1+); TxLength-; I2C_ITConfig(I2C1, I2C_IT_BUF , ENABLE); / also allow TxE break; case I2C_EVENT_SLAVE_BYTE_TRANSMITTED: /* EV3 */ /TRA, BUSY, TXE and BTF 0x60084 if (TxLength0) I2C_SendData(I2C1, *pTxBuffer1+); TxLength-; break; case 0x60080: / TRA, BUSY,TXE, no BTF / if this case added, above case would never be reached if (TxLength0) I2C_SendData(I2C1, *pTxBuffer1+); TxLength-; if (TxLength =0) SlaveTransitionComplete =1; i2c_comm_state = COMM_DONE; I2C_ITConfig(I2C1, I2C_IT_BUF , DISABLE);/close TxE int I2C_ITConfig(I2C1, I2C_IT_ERR , ENABLE);/to handle AF from master receiver PV_flag_1 = 0; break; /* Slave Receiver Events */ case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: /* EV1 */ / BUSY ADDR 0x20002 i2c_comm_state = COMM_IN_PROCESS; I2C_ITConfig(I2C1, I2C_IT_BUF , ENABLE); / also allow RxNE break; case I2C_EVENT_SLAVE_BYTE_RECEIVED: /* EV2 */ / BUSY RxNE 0x20040 *pRxBuffer1+ = I2C_ReceiveData(I2C1); RxLength-; / controled by i2c1 sender if (RxLength = 0) SlaveReceptionComplete = 1; I2C_ITConfig(I2C1, I2C_IT_BUF , DISABLE); / only EVT(STOPF) int I2C_ITConfig(I2C1, I2C_IT_EVT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年港口装卸作业信息化案例考核试卷
- 国际货运代理实务之国际货运代理行业标准考核试卷
- 2025年家长“双减”认知提升“双减”政策落实能力考核试卷
- 2025年化妆品行业天然原料与化妆品研发研究报告及未来发展趋势预测
- 2025年互联网医疗产业互联网医疗模式与创新研究报告及未来发展趋势预测
- 2025年光伏电站运维实践能力提升考核试卷
- 2025年科技创新行业科技创新生态圈构建与技术孵化研究报告及未来发展趋势预测
- 2026南方传媒校园招聘考试笔试备考试题及答案解析
- 2025重庆市綦江区三角镇人民政府招聘公益性岗位人员3人考试笔试参考题库附答案解析
- 2025贵州余庆县农业农村局招募特聘农技人员笔试考试备考试题及答案解析
- 二级钢筋混凝土管配筋设计图册
- 2025年入团考试知识点及试题及答案
- 前台转正考核试题及答案
- 青少年科学素养大赛-科学思维知识考试题库(300题)
- 新质生产力下的企业数字化转型博弈分析
- 北京花园乡村建设导则
- 2024年检验检测机构管理评审报告
- 卫蓝新能公司和固态产品介绍11-17
- 2025年中国华电集团公司招聘笔试参考题库含答案解析
- 下肢神经损伤的临床表现
- 2025年湖北农商行招聘笔试参考题库含答案解析
评论
0/150
提交评论