[an error occurred while processing this directive]
|
Храним во флеше данные в 2х байтах 1-н, т.е. код Хэмминга [7,4]
Смысл кода таков:
На входе 4 бита, на выходе 7, дополнительные 3бита получаются следующим образом:
Доп.бит | Функция |
---|---|
I4 | I2 xor I2 xor I0 |
I5 | I3 xor I2 xor I1 |
I6 | I3 xor I1 xor I0 |
Вход D3..D0 | Дополнение D6..D4 |
---|---|
0000 | 000 |
0001 | 101 |
0010 | 111 |
0011 | 010 |
0100 | 011 |
0101 | 110 |
0110 | 100 |
0111 | 001 |
1000 | 110 |
1001 | 011 |
1010 | 001 |
1011 | 100 |
1100 | 101 |
1101 | 000 |
1110 | 010 |
1111 | 111 |
Восстанавливаем следующим образом:
Бит кода ошибки | Функция |
---|---|
D0 | I4 xor I2 xor I1 xor I0 |
D1 | I5 xor I3 xor I2 xor I1 |
D2 | I6 xor I3 xor I1 xor I0 |
Где I0...I3 - биты данных кода Хэмминга, I4...I6 - доп биты кода Хэмминга, D0...D3 - код ошибки
Затем коррекция данных по коду ошибки:
код ошибки | Значение |
---|---|
000 | нет ошибки |
001 | ошибка бита I6 (доп бит) |
010 | ошибка бита I5 (доп бит) |
011 | ошибка бита I3 |
100 | ошибка бита I4 (доп бит) |
101 | ошибка бита I0 |
110 | ошибка бита I2 |
111 | ошибка бита I1 |
реализация кодера:
const unsigned char Tet2Ham[] = {
0x00, 0x51, 0x72, 0x23, 0x34, 0x65, 0x46, 0x17,
0x68, 0x39, 0x1A, 0x4B, 0x5C, 0x0D, 0x2E, 0x7F
};void WriteFlash(unsigned short Adr, unsigned char Value)
{
LowLevelWriteFlash(Adr*2, Tet2Ham[Value&0x0F]);
LowLevelWriteFlash(Adr*2+1, Tet2Ham[Value>>4]);
}
Помогите реализовать оптимальный код декодера...
В случае если код ошибки говорит что ошибка в битах I4...I6 (в доп битах) -
игнорировать (выдавать вход на выход)
E-mail: info@telesys.ru