I2C编号 | I2C名称 | 对应管脚 |
1 | I2C1 | PB6, PB7 |
2 | I2C2 | PB10, PB11 |
#define CPS1848_I2C I2C2 #define CHECK_BUSY(checkflag,busyendflag,dwCnt, dwTimeOut) \ for (dwCnt =0; dwCnt< dwTimeOut; dwCnt++) \ { \ if((checkflag) == (busyendflag))\ {\ break;\ }\ } #define CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut) \ if (dwBusyCount >= dwTimeOut) \ { \ return ERR_WAIT_BUSY; \ } // I2C 外设(CPS1848)初始化 void I2C_CPS1848_Init(BYTE ucBoardAddr) { //GPIO初始化 GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; /* 使能与 I2Cx 引脚的GPIO的时钟 */ RCC_APB2PeriphClockCmd(CPS1848_I2C_SCL_GPIO_CLK | CPS1848_I2C_SDA_GPIO_CLK, ENABLE); /* 使能 I2Cx 外设时钟 */ RCC_APB1PeriphClockCmd(CPS1848_I2C_CLK, ENABLE); /* Reset I2Cx IP */ RCC_APB1PeriphResetCmd(CPS1848_I2C_CLK, ENABLE); /* Release reset signal of I2Cx IP */ RCC_APB1PeriphResetCmd(CPS1848_I2C_CLK, DISABLE); /* I2Cx_SCL */ GPIO_InitStructure.GPIO_Pin = CPS1848_I2C_SCL_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(CPS1848_I2C_SCL_PORT, &GPIO_InitStructure); /* I2Cx_SDA*/ GPIO_InitStructure.GPIO_Pin = CPS1848_I2C_SDA_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(CPS1848_I2C_SDA_PORT, &GPIO_InitStructure); //模式初始化 /* I2Cx 配置 */ I2C_InitStructure.I2C_Mode = I2C_Mode_SMBusHost/*I2C_Mode_I2C */; /* 高电平数据稳定,低电平数据变化 SCL 时钟线的占空比 */ I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = (ucBoardAddr << 1); I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ; /* I2Cx的寻址模式 */ I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; /* 通信速率 */ I2C_InitStructure.I2C_ClockSpeed = 100000; //Standard-mode devices at 100 Kbps /* I2Cx 初始化 */ I2C_Init(CPS1848_I2C, &I2C_InitStructure); /* 使能 I2Cx 外设*/ I2C_Cmd(CPS1848_I2C, ENABLE); /*使能或者失能指定的I2C应答功能*/ I2C_AcknowledgeConfig(CPS1848_I2C, ENABLE); } |
BYTE I2C_CPS1848_Read(uint8_t cps1848_index, uint32_t RegAddr, uint32_t *pdwData) { volatile uint32_t i2cdata = 0; uint16_t NumByteToRead = 4; DWORD dwBusyCount = 0; const DWORD dwTimeOut = 1000; CHECK_POINTER_RET_ERR(pdwData); /* 等待busy位 */ dwBusyCount = 0; CHECK_BUSY(I2C_GetFlagStatus(CPS1848_I2C, I2C_FLAG_BUSY), RESET, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* Enable Acknowledgement to be ready for another reception necessary...*/ I2C_AcknowledgeConfig(CPS1848_I2C, ENABLE); /* 发送开始信号 */ I2C_GenerateSTART(CPS1848_I2C, ENABLE); /* 等待握手 */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_MODE_SELECT), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 发送目标地址 : Reset the address bit0 for write*/ I2C_Send7bitAddress(CPS1848_I2C, ((CPS1848_I2C_ADDR+cps1848_index) << 1), I2C_Direction_Transmitter); /* 等待握手 */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 发送寄存器地址--高8bit */ I2C_SendData(CPS1848_I2C, ((RegAddr>>18) & 0xff)); /* 等待握手 */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 发送寄存器地址--中8bit */ I2C_SendData(CPS1848_I2C, ((RegAddr>>10) & 0xff)); /* 等待握手 */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 发送寄存器地址--低8bit */ I2C_SendData(CPS1848_I2C, ((RegAddr>>2) & 0xff)); /* 等待握手 */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 开始读取数据 */ I2C_GenerateSTART(CPS1848_I2C, ENABLE); /* Test on EV5 and clear it */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_MODE_SELECT), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 发送读取的地址: Set the address bit0 for read*/ I2C_Send7bitAddress(CPS1848_I2C, ((CPS1848_I2C_ADDR+cps1848_index) << 1) | 0x01, I2C_Direction_Receiver); /* Test on EV6 and clear it */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); while(NumByteToRead--) { if (0 == NumByteToRead) { /* 最后一个数据了,发送非应答信号(Disable Acknowledgement),结束传输;*/ I2C_AcknowledgeConfig(CPS1848_I2C, DISABLE); /* 发送停止位 */ I2C_GenerateSTOP(CPS1848_I2C, ENABLE); } /* Test on EV7 and clear it */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_BYTE_RECEIVED), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); i2cdata = (i2cdata<<8) | (I2C_ReceiveData(CPS1848_I2C)); } *pdwData = i2cdata; /* Enable Acknowledgement to be ready for another reception */ I2C_AcknowledgeConfig(CPS1848_I2C, ENABLE); return ERR_SUCCESS; } |
BYTE I2C_CPS1848_Write(uint8_t cps1848_index, uint32_t RegAddr, uint32_t RegData) { DWORD dwBusyCount = 0; const DWORD dwTimeOut = 10000; /* 等待busy位 */ dwBusyCount = 0; CHECK_BUSY(I2C_GetFlagStatus(CPS1848_I2C, I2C_FLAG_BUSY), RESET, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 发送开始信号 */ I2C_GenerateSTART(CPS1848_I2C, ENABLE); /* 等待握手 */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_MODE_SELECT), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 发送目标地址 */ I2C_Send7bitAddress(CPS1848_I2C, ((CPS1848_I2C_ADDR+cps1848_index) << 1), I2C_Direction_Transmitter); /* 等待握手 */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 发送寄存器地址--高8bit */ I2C_SendData(CPS1848_I2C, ((RegAddr>>18) & 0xff)); /* 等待握手 */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 发送寄存器地址--中8bit */ I2C_SendData(CPS1848_I2C, ((RegAddr>>10) & 0xff)); /* 等待握手 */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 发送寄存器地址--低8bit */ I2C_SendData(CPS1848_I2C, ((RegAddr>>2) & 0xff)); /* 等待握手 */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 发送数据 */ I2C_SendData(CPS1848_I2C, ((RegData>>24) & 0xff)); /* 等待握手 */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 发送数据 */ I2C_SendData(CPS1848_I2C, ((RegData>>16) & 0xff)); /* 等待握手 */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 发送数据 */ I2C_SendData(CPS1848_I2C, ((RegData>>8) & 0xff)); /* 等待握手 */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 发送数据 */ I2C_SendData(CPS1848_I2C, ((RegData) & 0xff)); /* 等待握手 */ dwBusyCount = 0; CHECK_BUSY(I2C_CheckEvent(CPS1848_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED), SUCCESS, dwBusyCount, dwTimeOut); CHECK_WAIT_BUSY(dwBusyCount, dwTimeOut); /* 发送停止位 */ I2C_GenerateSTOP(CPS1848_I2C, ENABLE); return ERR_SUCCESS; } |
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |