Witam
Staram się sterować TLC5923 w tym celu potrzebuję stworzyć tablicę 16 elementowo gdzie każdy element będzie się składał z 7 bitów a następnie modyfikować wybrany element.
zależałoby mi żeby był to jeden Ciąg znaków bo zapisuje się do tego scalaka jako jedno 112bit słowo, przez interfejs podobny do SPI
Jakieś pomysły jak to zrobić albo propozycje innego rozwiązania ?
- Rejestracja:ponad 10 lat
- Ostatnio:ponad 8 lat
- Postów:1
0
- Rejestracja:około 10 lat
- Ostatnio:około 8 godzin
- Lokalizacja:Tam gdzie jest (centy)metro...
0
#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>
typedef union {
struct {
uint8_t val0;
uint8_t val1;
//...
uint8_t val15;
} data;
uint8_t table[16];
struct {
uint64_t first;
uint64_t second;
} stream;
} msg_t;
void clear_msg(msg_t *msg) {
// Czyści msg.
msg->stream.first = 0;
msg->stream.second = 0;
}
void send_prepare(msg_t *msg) {
// Funkcja przesuwająca bity tak by przygotować je do przesłania przez SPI.
// Pracuje na msg.stream i zeruje "ogon" danych.
}
void send(const msg_t *msg) {
// Funkcja przesyłająca dane przez SPI. Pracuje na msg.stream.
}
int main() {
msg_t msg;
clear_msg(&msg);
// Dostęp przez wartości w sekcji .data...
msg.data.val0 = 0x01;
msg.data.val1 = 0x02;
// Dostęp przez tablicę
msg.table[2] = 0x03;
// Dostęp przez "strumień"
msg.stream.second = 0x1122334455667788;
// Jedynie w celu udokumentowania.
// W zależności od kolejności bajtów maszyny, inny wynik...
printf("msg.stream.first = 0x%" PRIX64 "\n", msg.stream.first);
printf("msg.stream.second = 0x%" PRIX64 "\n", msg.stream.second);
return 0;
}
Ja bym to zrobił tak. Pola bitowe zawsze się kończą źle na tak niskim poziomie (instrukcje asm są z reguły nieefektywne). W zależności od kolejności bajtów maszyny (big/little)endian, przestaw pola lub zmień sposób obróbki danych.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.