к1986ве92fi подключение датчика LPS25HB по I2C_часть1
к1986ве92fi подключение датчика LPS25HB по I2C_часть1
в последней части выложу код который нужен для датчика а сдесь все в куче #include "I2C_init.h" I2C_InitTypeDef I2C_str; DMA_CtrlDataInitTypeDef dma_i2c_tx; DMA_ChannelInitTypeDef dma_i2c_tx_ch; uint8_t dma_i2c_tx_buffer[128] = {0}; // Буфер передачи DMA void I2C1_Init(void) { I2C_InitTypeDef i2c; PORT_InitTypeDef port; RST_CLK_PCLKcmd(RST_CLK_PCLK_I2C, ENABLE); RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTC, ENABLE); PORT_StructInit(&port); port.PORT_Pin = PORT_Pin_0 | PORT_Pin_1; port.PORT_OE = PORT_OE_OUT; port.PORT_MODE = PORT_MODE_DIGITAL; port.PORT_SPEED = PORT_SPEED_FAST; port.PORT_FUNC = PORT_FUNC_ALTER; PORT_Init(MDR_PORTC, &port); I2C_DeInit(); I2C_StructInit(&i2c); i2c.I2C_Speed = I2C_SPEED_UP_TO_400KHz; i2c.I2C_ClkDiv = 160; I2C_Init(&i2c); I2C_Cmd(ENABLE); } // ====================================================================== // Отправка данных по I2C // ====================================================================== ErrorStatus I2C_SendData(uint8_t slaveAddress, uint8_t* data, uint32_t dataSize) { uint32_t timeout; // 1. Ждем освобождения шины timeout = 100000; while(I2C_GetFlagStatus(I2C_FLAG_BUS_BUSY) == SET) { if(timeout-- == 0) return ERROR; } // 2. Отправляем адрес (START + адрес генерируются автоматически) I2C_Send7bitAddress(slaveAddress, I2C_Direction_Transmitter); // 3. Ждем завершения передачи адреса (флаг TRANS) timeout = 100000; while(I2C_GetFlagStatus(I2C_FLAG_TRANS) == RESET) { if(timeout-- == 0) return ERROR; } // 4. Проверяем NACK (устройство не ответило) if(I2C_GetFlagStatus(I2C_FLAG_SLAVE_NACK) == SET) { I2C_SendSTOP(); return ERROR; } // 5. Отправляем данные for(uint32_t i = 0; i ﹤ dataSize; i++) { I2C_SendByte(data[i]); // Ждем завершения отправки байта (флаг TRANS) timeout = 100000; while(I2C_GetFlagStatus(I2C_FLAG_TRANS) == RESET) { if(timeout-- == 0) return ERROR; } // Проверяем NACK if(I2C_GetFlagStatus(I2C_FLAG_SLAVE_NACK) == SET) { I2C_SendSTOP(); return ERROR; } } // 6. Отправляем STOP I2C_SendSTOP(); return SUCCESS; } // ====================================================================== // Чтение данных по I2C // ====================================================================== ErrorStatus I2C_ReadData(uint8_t slaveAddress, uint8_t* buffer, uint32_t bufferSize) { uint32_t timeout; // 1. Ждем освобождения шины timeout = 100000; while(I2C_GetFlagStatus(I2C_FLAG_BUS_BUSY) == SET) { if(timeout-- == 0) return ERROR; } // 2. Отправляем адрес в режиме чтения I2C_Send7bitAddress(slaveAddress, I2C_Direction_Receiver); // 3. Ждем завершения передачи адреса timeout = 100000; while(I2C_GetFlagStatus(I2C_FLAG_TRANS) == RESET) { if(timeout-- == 0) return ERROR; } // 4. Проверяем NACK if(I2C_GetFlagStatus(I2C_FLAG_SLAVE_NACK) == SET) { I2C_SendSTOP(); return ERROR; } // 5. Читаем данные for(uint32_t i = 0; i ﹤ bufferSize; i++) { // Для последнего байта отправляем NACK, иначе ACK if (i == bufferSize - 1) { I2C_StartReceiveData(0); // NACK } else { I2C_StartReceiveData(1); // ACK } // Ждем, пока байт будет принят timeout = 100000; while(I2C_GetFlagStatus(I2C_FLAG_TRANS) == RESET) { if(timeout-- == 0) return ERROR; } buffer[i] = I2C_GetReceivedData(); } // 6. Отправляем STOP I2C_SendSTOP(); return SUCCESS; }