Ср мар 06, 2019 17:42:26
Ср мар 06, 2019 17:48:53
Ср мар 06, 2019 22:25:47
Чт мар 07, 2019 00:23:09
num2dec1(_bmp280_temp,2);
uart_puts("\r");
_bmp280_temp--;
_bmp280_temp^=0xFFFFFFFF;
num2dec1(_bmp280_temp,2);
uart_puts("\r");
// вывод в терминале
23.22
-23.22
Прошу прощения за мое невежество, но - не знаю. Пишу в 7 AtmelStudio, на уровне чайника с боольшим носиком.DESIER писал(а):А в каком компиляторе вы пишите?
Вт мар 19, 2019 15:41:14
if (temper_float >100) // если значение температуры перевалило в отрицательные значения
{
temper_float = 409.6-temper_float;
temper_float = -temper_float;
}
Вт мар 19, 2019 16:35:34
Ср мар 20, 2019 10:45:28
При положительном значении ( S=0 ) код перевести в десятичный и умножить на 0,0625 °C.
При отрицательном значении ( S=1 ) сначала необходимо перевести дополнительный код в прямой. Для этого надо инвертировать каждый разряд двоичного кода и прибавить 1. А затем перевести в десятичный и умножить на 0,0625 °C.
uint32_t I2C1_ReadDataU24(uint8_t addr, uint8_t Reg)
{
uint8_t data[3];
uint32_t rezult =0;
data[0] = I2C1_MemoryRead(addr, Reg);
data[1] = I2C1_MemoryRead(addr, Reg + 1);
data[2] = I2C1_MemoryRead(addr, Reg + 2);
rezult = data[0];
rezult = rezult<<8;
rezult |= data[1];
rezult = rezult<<8;
rezult |= data[2];
return rezult;
}
Вт мар 26, 2019 16:16:28
Ср июн 15, 2022 06:40:39
Ср июн 15, 2022 12:42:25
Ср июн 15, 2022 17:11:00
Чт июн 16, 2022 17:14:39
Пт июн 17, 2022 07:55:21
BMPE_Cal.dig_P9 = I2C_Read8(BMPE_Address, 0x9E);
// Костыль. Датчик вешает шину, не позволяя дать NACK.
if ((GPIOF->IDR & GPIO_IDR_IDR_0) == 0) {
GPIOF->BSRR = GPIO_BSRR_BS_1;
GPIOF->MODER &= 0xFFFFFFF3;
GPIOF->MODER |= 0x00000004;
while ((GPIOF->IDR & GPIO_IDR_IDR_0) == 0) {
delay_us(5);
GPIOF->BSRR = GPIO_BSRR_BR_1;
delay_us(5);
GPIOF->BSRR = GPIO_BSRR_BS_1;
};
GPIOF->MODER &= 0xFFFFFFF3;
GPIOF->MODER |= 0x00000008;
};
InitI2C2();
uint8_t I2C_Read8(uint8_t DevAddr, uint8_t RegAddr) {
uint8_t value;
(void) (I2C2->ISR);
I2C2->TXDR = RegAddr;
I2C2->ICR = I2C_ICR_STOPCF;
I2C2->CR2 = (I2C_CR2_AUTOEND | ((DevAddr << 1) & 0xFE) | (1<<16) | I2C_CR2_START);
while (!(I2C2->ISR & (I2C_ISR_TXE | I2C_ISR_NACKF))) {};
if (I2C2->ISR & I2C_ISR_NACKF) {
I2C2->ICR = I2C_ICR_STOPCF | I2C_ICR_NACKCF;
delay_ms(1);
return -1;
};
I2C2->ICR = 0x3F38; // В очередной раз сбрасываем флаги
// Настраиваем модуль на чтение одного (1) байта, сразу готовимся ответить NACK, и запускаем (START) передачу.
I2C2->CR2 = (I2C_CR2_AUTOEND | I2C_CR2_NACK | ((DevAddr << 1) & 0xFE) | I2C_CR2_RD_WRN | (1<<16) | I2C_CR2_START);
while (!(I2C2->ISR & I2C_ISR_RXNE)) {}; // Успешно читаем результат
value = (I2C2->RXDR); // Возвращаем значение. STOP должен сгенерироваться самостоятельно (AUTOEND).
return value;
}
void I2C_Write8(uint8_t DevAddr, uint8_t RegAddr, uint8_t RegValue) {
I2C2->TXDR = RegAddr;
I2C2->ICR = 0x3F38;
I2C2->CR2 = (((DevAddr << 1) & 0xFE) | (2<<16) | I2C_CR2_START);
while (!(I2C2->ISR & I2C_ISR_TXE)) {}; // <--------- Вот тут виснем, ибо SCK = 1, SDA = 0. WTF?
I2C2->TXDR = RegValue;
while (!(I2C2->ISR & I2C_ISR_TXE)) {};
I2C2->CR2 = I2C_CR2_STOP;
}
Пт июн 17, 2022 17:01:15
Пн июн 20, 2022 06:22:17
SCK ````|____|````|____|````|____|````|____|````|____
SDA ``|__(s)___(0)__|````(1)```|___(0)__|``````````|_
Вт июн 21, 2022 18:44:45
Ср июн 22, 2022 06:29:35
Вт янв 31, 2023 18:53:13
Вт янв 31, 2023 19:09:54
Сб фев 04, 2023 14:03:25