arm gcc (CooCox)를 사용하여 STM32F4 검색을 프로그래밍하고 있으며 엔디안 문제로 씨름하고 있습니다.
SPI를 통해 24 비트 ADC로 샘플링하고 있습니다. 3 바이트가 들어 오기 때문에 MSB는 먼저 유니언에로드하여 사용하기가 더 쉬워졌습니다 (어쨌든 희망했습니다!).
typedef union
{
int32_t spilong;
uint8_t spibytes [4];
uint16_t spihalfwords [2];} spidata;
spidata analogin0;
MSB로 [0]을 사용하여 spi 읽기를 사용하여 데이터를 analogin0.spibytes [0]-[2]에로드 한 다음 USART를 통해 한 번에 8 비트의 megabaud로 뱉었습니다. 아무 문제 없습니다.
12 비트 DAC에 데이터를 전달하려고 할 때 문제가 시작되었습니다. 이 SPI DAC는 MSB에서 시작하는 4 비트 접두사와 12 비트의 데이터로 구성된 16 비트 워드를 원합니다.
초기의 시도는 ADC가 나에게 2 진수를 상쇄하도록 변환하는 것이 었습니다. 0x8000으로 analogin0.spihalfwords [0]를 xoring하여 결과를 맨 아래 12 비트로 이동 한 다음 접두사를 산술적으로 추가하여 바이너리를 오프셋합니다.
analogin0.spibytes [0] = 0xFF 및 analogin0.spibytes [1] = 0xB5에 대해 analogin0.halfwords [0]이 0xFFB5가 아닌 0xB5FF와 같았다는 것을 알 때까지 놀랍게도 실망 스럽습니다.
이것을 알아 차린 후에 나는 산술 연산과 하프 워드 사용을 중단하고 비트 논리와 바이트를 고수했습니다.
uint16_t temp=0;
.
.
.
// work on top 16 bits
temp= (uint16_t)(analogin0.spibytes[0])<<8|(uint16_t)(analogin0.spibytes[1]);
temp=temp^0x8000; // convert twos complement to offset binary
temp=(temp>>4) | 0x3000; // shift and prepend with bits to send top 12 bits to DAC A
SPI_I2S_SendData(SPI3,temp); //send to DACa (16 bit SPI words)
... 그리고 잘 작동했습니다. 첫 번째 코드 줄, 0xFFB5가 아닌 0xB5FF가 아닌 임시로 들여다 볼 때 모든 것이 좋습니다.
그래서 질문이 있다면 ...
피질은 나에게 새로운 것입니다. 두 플랫폼이 거의 엔디안이지만 PIC가 바이트 교환을 int16에서 기억하는 것을 기억할 수 없습니다. 이 올바른지?
이것을 처리하는 더 우아한 방법이 있습니까? ARM7을 빅 엔디안 모드로 전환하면 좋을 것입니다. 나는 Cortex M4에 대한 많은 참조가 bi-endian 인 것을보고 있지만 모든 출처는 실제로 어떻게 나에게 말하는지 부족한 것처럼 보입니다 . 보다 구체적으로, 어떻게 빅 엔디안 모드로 STM32f407 배치합니까 는 GCC에서 할 수 있으면 더 나은. 이것은 단지 AIRCR 레지스터에서 적절한 비트를 설정하는 문제입니까? 컴파일러를 일치 시키도록 설정해야하거나 나중에 일관성이없는 라이브러리를 사용하여 계산해야하는 등의 영향이 있습니까?