|
@@ -57,7 +57,7 @@ void i2c_master_init(void) {
|
|
|
/**
|
|
|
* @brief Запись регистра slave-устройства
|
|
|
*/
|
|
|
-t_i2c_status i2c_wr_reg(uint8_t address, uint8_t reg_addr, uint16_t data) {
|
|
|
+t_i2c_status i2c_wr_reg(const uint8_t address, const uint8_t data) {
|
|
|
|
|
|
//Ждем освобождения шины I2C
|
|
|
wait_event((I2C->SR3 & I2C_SR3_BUSY), 10);
|
|
@@ -79,17 +79,7 @@ t_i2c_status i2c_wr_reg(uint8_t address, uint8_t reg_addr, uint16_t data) {
|
|
|
//Ждем освобождения регистра данных
|
|
|
wait_event(!(I2C->SR1 & I2C_SR1_TXE), 1);
|
|
|
//Отправляем адрес регистра
|
|
|
- I2C->DR = reg_addr;
|
|
|
-
|
|
|
- //Отправка данных
|
|
|
- //Ждем освобождения регистра данных
|
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_TXE), 1);
|
|
|
- //Отправляем адрес регистра
|
|
|
- I2C->DR = (uint8_t)(data >> 8);
|
|
|
- //Ждем освобождения регистра данных
|
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_TXE), 1);
|
|
|
- //Отправляем адрес регистра
|
|
|
- I2C->DR = (uint8_t)data;
|
|
|
+ I2C->DR = data;
|
|
|
|
|
|
//Ловим момент, когда DR освободился и данные попали в сдвиговый регистр
|
|
|
wait_event(!((I2C->SR1 & I2C_SR1_TXE) && (I2C->SR1 & I2C_SR1_BTF)), 1);
|
|
@@ -106,7 +96,7 @@ t_i2c_status i2c_wr_reg(uint8_t address, uint8_t reg_addr, uint16_t data) {
|
|
|
* @brief Чтение регистра slave-устройства
|
|
|
* @note Start -> Slave Addr -> Reg. addr -> Restart -> Slave Addr <- data ... -> Stop
|
|
|
*/
|
|
|
-t_i2c_status i2c_rd_reg(uint8_t address, uint8_t reg_addr, uint16_t * data) {
|
|
|
+t_i2c_status i2c_rd_reg(const uint8_t address, uint8_t * data) {
|
|
|
|
|
|
//Ждем освобождения шины I2C
|
|
|
wait_event((I2C->SR3 & I2C_SR3_BUSY), 10);
|
|
@@ -119,56 +109,33 @@ t_i2c_status i2c_rd_reg(uint8_t address, uint8_t reg_addr, uint16_t * data) {
|
|
|
//Ждем установки бита SB
|
|
|
wait_event(!(I2C->SR1 & I2C_SR1_SB), 1);
|
|
|
|
|
|
- //Записываем в регистр данных адрес ведомого устройства
|
|
|
- I2C->DR = address & 0xFE;
|
|
|
- //Ждем подтверждения передачи адреса
|
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 1);
|
|
|
- //Очистка бита ADDR чтением регистра SR3
|
|
|
- I2C->SR3;
|
|
|
-
|
|
|
- //Ждем освобождения регистра данных RD
|
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_TXE), 1);
|
|
|
-
|
|
|
- //Передаем адрес регистра slave-устройства, который хотим прочитать
|
|
|
- I2C->DR = reg_addr;
|
|
|
- //Ловим момент, когда DR освободился и данные попали в сдвиговый регистр
|
|
|
- wait_event(!((I2C->SR1 & I2C_SR1_TXE) && (I2C->SR1 & I2C_SR1_BTF)), 1);
|
|
|
-
|
|
|
- //Генерация СТАРТ-посылки (рестарт)
|
|
|
- I2C->CR2 |= I2C_CR2_START;
|
|
|
- //Ждем установки бита SB
|
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_SB), 1);
|
|
|
-
|
|
|
//Записываем в регистр данных адрес ведомого устройства и переходим
|
|
|
//в режим чтения (установкой младшего бита в 1)
|
|
|
I2C->DR = address | 0x01;
|
|
|
-
|
|
|
- //Отправка двух байт данных
|
|
|
//Бит который разрешает NACK на следующем принятом байте
|
|
|
- I2C->CR2 |= I2C_CR2_POS;
|
|
|
+ //I2C->CR2 |= I2C_CR2_POS;
|
|
|
//Ждем подтверждения передачи адреса
|
|
|
wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 1);
|
|
|
- //Заплатка из Errata
|
|
|
- disableInterrupts();
|
|
|
//Очистка бита ADDR чтением регистра SR3
|
|
|
I2C->SR3;
|
|
|
+ // wait for BTF
|
|
|
+ wait_event(!(I2C->SR1 & I2C_SR1_BTF), 1);
|
|
|
//Запрещаем подтверждение в конце посылки
|
|
|
I2C->CR2 &= (uint8_t)(~I2C_CR2_ACK);
|
|
|
- //Заплатка из Errata
|
|
|
- enableInterrupts();
|
|
|
- //Ждем момента, когда первый байт окажется в DR,
|
|
|
- //а второй в сдвиговом регистре
|
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_BTF), 1);
|
|
|
-
|
|
|
//Заплатка из Errata
|
|
|
disableInterrupts();
|
|
|
+ // Read 1st byte
|
|
|
+ data[0] = I2C->DR;
|
|
|
//Устанавлием бит STOP
|
|
|
I2C->CR2 |= I2C_CR2_STOP;
|
|
|
- //Читаем принятые байты
|
|
|
- *data = I2C->DR << 8;
|
|
|
+ // Read 2nd byte
|
|
|
+ data[1] = I2C->DR;
|
|
|
//Заплатка из Errata
|
|
|
enableInterrupts();
|
|
|
- *data |= I2C->DR;
|
|
|
+ // Wait for RXNE
|
|
|
+ wait_event(!(I2C->SR1 & I2C_SR1_RXNE), 1);
|
|
|
+ // Read 3rd Data byte
|
|
|
+ data[2] = I2C->DR;
|
|
|
|
|
|
//Ждем отправки СТОП посылки
|
|
|
wait_event((I2C->CR2 & I2C_CR2_STOP), 1);
|