Показать сообщение отдельно
Старый 12.11.2017, 19:11   #97
Kisel39
Старший Пользователь
 
Регистрация: 28.02.2013
Возраст: 45
Город: Железнодорожный
Регион: 50, 90, 150
Машина: Polo Sedan
Сообщений: 174
Kisel39 is a splendid one to beholdKisel39 is a splendid one to beholdKisel39 is a splendid one to beholdKisel39 is a splendid one to beholdKisel39 is a splendid one to beholdKisel39 is a splendid one to beholdKisel39 is a splendid one to behold
По умолчанию

так как чтение регистров из чипа начинается с 0x0A и далее инкримент, читаю по 8 бит без сдвига для создания 16 битных регистров, читать все смысла нет, нужны только с 0x0A по 0x0F, то есть 6 по 16 бит или 12 по 8 бит.
бит RDSR не использую, так как читаю по прерыванию.


uint8_t Si4709_read[12];
#define RDSR Si4709_read[0x00] & 0x80 // 0x0A
#define RDS_0A Si4709_read[0x06] >> 3 == 0 // 0x0D
#define RDS_2A Si4709_read[0x06] >> 3 == 4 // 0x0D
#define RDS_0A_ID Si4709_read[0x07] & 0x03 // 0x0D
#define RDS_2A_ID Si4709_read[0x07] & 0x0F // 0x0D
#define RDS_C_h Si4709_read[0x08] // 0x0E
#define RDS_C_l Si4709_read[0x09] // 0x0E
#define RDS_D_h Si4709_read[0x0A] // 0x0F
#define RDS_D_l Si4709_read[0x0B] // 0x0F

uint8_t Si4709_write[8] = {0x40, 0x01, 0x00, 0x00, 0x98, 0x04, 0x00, 0x1D}; // начальная конфигурация
uint8_t rdsBuffer[9];
uint8_t rdsBuffer2[65];
uint8_t completed, flag, flag2, razmer;
uint16_t completed2;

void RDS(void) {
rdsBuffer[0] = 0x01;
rdsBuffer2[0] = 0x02;
READ_4709();

if (RDS_0A) {
if (rdsBuffer[(RDS_0A_ID) * 2 + 1] != RDS_D_h ||
rdsBuffer[(RDS_0A_ID) * 2 + 2] != RDS_D_l) {
rdsBuffer[(RDS_0A_ID) * 2 + 1] = RDS_D_h;
rdsBuffer[(RDS_0A_ID) * 2 + 2] = RDS_D_l;
completed = 0;
flag = 1;
}
completed |= 1 << (RDS_0A_ID);
if (completed == 0x0F && flag) {
CDC_Transmit_FS(rdsBuffer, 9);
flag = 0;
}
}
if (RDS_2A) {
if (rdsBuffer2[(RDS_2A_ID) * 4 + 1] != RDS_C_h ||
rdsBuffer2[(RDS_2A_ID) * 4 + 2] != RDS_C_l ||
rdsBuffer2[(RDS_2A_ID) * 4 + 3] != RDS_D_h ||
rdsBuffer2[(RDS_2A_ID) * 4 + 4] != RDS_D_l) {
rdsBuffer2[(RDS_2A_ID) * 4 + 1] = RDS_C_h;
rdsBuffer2[(RDS_2A_ID) * 4 + 2] = RDS_C_l;
rdsBuffer2[(RDS_2A_ID) * 4 + 3] = RDS_D_h;
rdsBuffer2[(RDS_2A_ID) * 4 + 4] = RDS_D_l;
completed2 = 0;
flag2 = 1;
}
completed2 |= 1 << (RDS_2A_ID);
if (completed2 == 0xFFFF && flag2) {
for (int i = 64; i > 0; i--) { // сокращаем размер пакета, убирая прбелы с конца
if (rdsBuffer2[i] != 0x20) {
razmer = i + 1;
break;
}
}
CDC_Transmit_FS(rdsBuffer2, razmer);
flag2 = 0;
}
}

HAL_Delay(40);
}


Все написаное только для чтения RDS.
Kisel39 вне форума   Ответить с цитированием