|
@@ -71,30 +71,30 @@ t_i2c_status i2c_wr_data(const uint8_t address, const uint8_t num_bytes_to_wr, u
|
|
//Генерация СТАРТ-посылки
|
|
//Генерация СТАРТ-посылки
|
|
I2C->CR2 |= I2C_CR2_START;
|
|
I2C->CR2 |= I2C_CR2_START;
|
|
//Ждем установки бита SB
|
|
//Ждем установки бита SB
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_SB), 1);
|
|
|
|
|
|
+ wait_event(!(I2C->SR1 & I2C_SR1_SB), 5);
|
|
|
|
|
|
//Записываем в регистр данных адрес ведомого устройства
|
|
//Записываем в регистр данных адрес ведомого устройства
|
|
I2C->DR = adr;
|
|
I2C->DR = adr;
|
|
//Ждем подтверждения передачи адреса
|
|
//Ждем подтверждения передачи адреса
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 1);
|
|
|
|
|
|
+ wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 5);
|
|
//Очистка бита ADDR чтением регистра SR3
|
|
//Очистка бита ADDR чтением регистра SR3
|
|
I2C->SR3;
|
|
I2C->SR3;
|
|
|
|
|
|
//Отправка данных
|
|
//Отправка данных
|
|
while (length--) {
|
|
while (length--) {
|
|
//Ждем освобождения регистра данных
|
|
//Ждем освобождения регистра данных
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_TXE), 1);
|
|
|
|
|
|
+ wait_event(!(I2C->SR1 & I2C_SR1_TXE), 5);
|
|
//Отправляем адрес регистра
|
|
//Отправляем адрес регистра
|
|
I2C->DR = *data++;
|
|
I2C->DR = *data++;
|
|
}
|
|
}
|
|
|
|
|
|
//Ловим момент, когда DR освободился и данные попали в сдвиговый регистр
|
|
//Ловим момент, когда DR освободился и данные попали в сдвиговый регистр
|
|
- wait_event(!((I2C->SR1 & I2C_SR1_TXE) && (I2C->SR1 & I2C_SR1_BTF)), 1);
|
|
|
|
|
|
+ wait_event(!((I2C->SR1 & I2C_SR1_TXE) && (I2C->SR1 & I2C_SR1_BTF)), 5);
|
|
|
|
|
|
//Посылаем СТОП-посылку
|
|
//Посылаем СТОП-посылку
|
|
I2C->CR2 |= I2C_CR2_STOP;
|
|
I2C->CR2 |= I2C_CR2_STOP;
|
|
//Ждем выполнения условия СТОП
|
|
//Ждем выполнения условия СТОП
|
|
- wait_event((I2C->CR2 & I2C_CR2_STOP), 1);
|
|
|
|
|
|
+ wait_event((I2C->CR2 & I2C_CR2_STOP), 5);
|
|
|
|
|
|
return I2C_SUCCESS;
|
|
return I2C_SUCCESS;
|
|
}
|
|
}
|
|
@@ -116,7 +116,7 @@ t_i2c_status i2c_rd_data(const uint8_t address, const uint8_t num_bytes_to_rd, u
|
|
//Генерация СТАРТ-посылки
|
|
//Генерация СТАРТ-посылки
|
|
I2C->CR2 |= I2C_CR2_START;
|
|
I2C->CR2 |= I2C_CR2_START;
|
|
//Ждем установки бита SB
|
|
//Ждем установки бита SB
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_SB), 1);
|
|
|
|
|
|
+ wait_event(!(I2C->SR1 & I2C_SR1_SB), 2);
|
|
|
|
|
|
//Записываем в регистр данных адрес ведомого устройства и переходим
|
|
//Записываем в регистр данных адрес ведомого устройства и переходим
|
|
//в режим чтения (установкой младшего бита в 1)
|
|
//в режим чтения (установкой младшего бита в 1)
|
|
@@ -128,7 +128,7 @@ t_i2c_status i2c_rd_data(const uint8_t address, const uint8_t num_bytes_to_rd, u
|
|
//Запрещаем подтверждение в конце посылки
|
|
//Запрещаем подтверждение в конце посылки
|
|
I2C->CR2 &= ~I2C_CR2_ACK;
|
|
I2C->CR2 &= ~I2C_CR2_ACK;
|
|
//Ждем подтверждения передачи адреса
|
|
//Ждем подтверждения передачи адреса
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 1);
|
|
|
|
|
|
+ wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 2);
|
|
|
|
|
|
//Заплатка из Errata
|
|
//Заплатка из Errata
|
|
__disable_interrupt();
|
|
__disable_interrupt();
|
|
@@ -141,7 +141,7 @@ t_i2c_status i2c_rd_data(const uint8_t address, const uint8_t num_bytes_to_rd, u
|
|
__enable_interrupt();
|
|
__enable_interrupt();
|
|
|
|
|
|
//Ждем прихода данных в RD
|
|
//Ждем прихода данных в RD
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_RXNE), 1);
|
|
|
|
|
|
+ wait_event(!(I2C->SR1 & I2C_SR1_RXNE), 2);
|
|
|
|
|
|
//Читаем принятый байт
|
|
//Читаем принятый байт
|
|
*data = I2C->DR;
|
|
*data = I2C->DR;
|
|
@@ -151,7 +151,7 @@ t_i2c_status i2c_rd_data(const uint8_t address, const uint8_t num_bytes_to_rd, u
|
|
//Бит который разрешает NACK на следующем принятом байте
|
|
//Бит который разрешает NACK на следующем принятом байте
|
|
I2C->CR2 |= I2C_CR2_POS;
|
|
I2C->CR2 |= I2C_CR2_POS;
|
|
//Ждем подтверждения передачи адреса
|
|
//Ждем подтверждения передачи адреса
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 1);
|
|
|
|
|
|
+ wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 2);
|
|
//Заплатка из Errata
|
|
//Заплатка из Errata
|
|
__disable_interrupt();
|
|
__disable_interrupt();
|
|
//Очистка бита ADDR чтением регистра SR3
|
|
//Очистка бита ADDR чтением регистра SR3
|
|
@@ -162,7 +162,7 @@ t_i2c_status i2c_rd_data(const uint8_t address, const uint8_t num_bytes_to_rd, u
|
|
__enable_interrupt();
|
|
__enable_interrupt();
|
|
//Ждем момента, когда первый байт окажется в DR,
|
|
//Ждем момента, когда первый байт окажется в DR,
|
|
//а второй в сдвиговом регистре
|
|
//а второй в сдвиговом регистре
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_BTF), 1);
|
|
|
|
|
|
+ wait_event(!(I2C->SR1 & I2C_SR1_BTF), 2);
|
|
|
|
|
|
//Заплатка из Errata
|
|
//Заплатка из Errata
|
|
__disable_interrupt();
|
|
__disable_interrupt();
|
|
@@ -177,7 +177,7 @@ t_i2c_status i2c_rd_data(const uint8_t address, const uint8_t num_bytes_to_rd, u
|
|
//N>2
|
|
//N>2
|
|
else if (length > 2) {
|
|
else if (length > 2) {
|
|
//Ждем подтверждения передачи адреса
|
|
//Ждем подтверждения передачи адреса
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 1);
|
|
|
|
|
|
+ wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 2);
|
|
|
|
|
|
//Заплатка из Errata
|
|
//Заплатка из Errata
|
|
__disable_interrupt();
|
|
__disable_interrupt();
|
|
@@ -190,7 +190,7 @@ t_i2c_status i2c_rd_data(const uint8_t address, const uint8_t num_bytes_to_rd, u
|
|
|
|
|
|
while (length-- > 3 && I2C_timeout) {
|
|
while (length-- > 3 && I2C_timeout) {
|
|
//Ожидаем появления данных в DR и сдвиговом регистре
|
|
//Ожидаем появления данных в DR и сдвиговом регистре
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_BTF), 1);
|
|
|
|
|
|
+ wait_event(!(I2C->SR1 & I2C_SR1_BTF), 2);
|
|
//Читаем принятый байт из DR
|
|
//Читаем принятый байт из DR
|
|
*data++ = I2C->DR;
|
|
*data++ = I2C->DR;
|
|
}
|
|
}
|
|
@@ -200,7 +200,7 @@ t_i2c_status i2c_rd_data(const uint8_t address, const uint8_t num_bytes_to_rd, u
|
|
//Осталось принять 3 последних байта
|
|
//Осталось принять 3 последних байта
|
|
//Ждем, когда в DR окажется N-2 байт, а в сдвиговом регистре
|
|
//Ждем, когда в DR окажется N-2 байт, а в сдвиговом регистре
|
|
//окажется N-1 байт
|
|
//окажется N-1 байт
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_BTF), 1);
|
|
|
|
|
|
+ wait_event(!(I2C->SR1 & I2C_SR1_BTF), 2);
|
|
//Запрещаем подтверждение в конце посылки
|
|
//Запрещаем подтверждение в конце посылки
|
|
I2C->CR2 &= ~I2C_CR2_ACK;
|
|
I2C->CR2 &= ~I2C_CR2_ACK;
|
|
//Заплатка из Errata
|
|
//Заплатка из Errata
|
|
@@ -215,13 +215,13 @@ t_i2c_status i2c_rd_data(const uint8_t address, const uint8_t num_bytes_to_rd, u
|
|
//Заплатка из Errata
|
|
//Заплатка из Errata
|
|
__enable_interrupt();
|
|
__enable_interrupt();
|
|
//Ждем, когда N-й байт попадет в DR из сдвигового регистра
|
|
//Ждем, когда N-й байт попадет в DR из сдвигового регистра
|
|
- wait_event(!(I2C->SR1 & I2C_SR1_RXNE), 1);
|
|
|
|
|
|
+ wait_event(!(I2C->SR1 & I2C_SR1_RXNE), 2);
|
|
//Читаем N байт
|
|
//Читаем N байт
|
|
*data++ = I2C->DR;
|
|
*data++ = I2C->DR;
|
|
}
|
|
}
|
|
|
|
|
|
//Ждем отправки СТОП посылки
|
|
//Ждем отправки СТОП посылки
|
|
- wait_event((I2C->CR2 & I2C_CR2_STOP), 1);
|
|
|
|
|
|
+ wait_event((I2C->CR2 & I2C_CR2_STOP), 2);
|
|
//Сбрасывает бит POS, если вдруг он был установлен
|
|
//Сбрасывает бит POS, если вдруг он был установлен
|
|
I2C->CR2 &= ~I2C_CR2_POS;
|
|
I2C->CR2 &= ~I2C_CR2_POS;
|
|
|
|
|