मैं STM32F4discovery प्रोग्राम करने के लिए आर्म gcc (CooCox) का उपयोग कर रहा हूं, और मैं w / एंडियन समस्या का सामना कर रहा हूं
मैं SPI के माध्यम से 24 बिट ADC के साथ नमूना ले रहा हूं। चूंकि तीन बाइट्स आ रहे हैं, पहले MSB मुझे उन्हें बनाने के लिए एक संघ में लोड करने का विचार था (मुझे उम्मीद है, वैसे भी!) का उपयोग करना थोड़ा आसान है।
typedef union
{
int32_t spilong;
uint8_t spibytes [4];
uint16_t spihalfwords [2];} spidata;
spidata analogin0;
मैं एसआईबी के रूप में [0] - [2] के साथ एमएसबी के रूप में [0] - [2] के साथ स्पाई का उपयोग करके डेटा लोड करता हूं, फिर मैं एक बार में 8 बिट्स पर मेगाबॉट में यूएसएआरटी के माध्यम से उन्हें थूकता हूं। कोई समस्या नहीं।
समस्याएं तब शुरू हुईं जब मैंने 12 बिट डीएसी में डेटा पास करने की कोशिश की। यह SPI DAC 16 बिट शब्द चाहता है, जिसमें MSB से शुरू होने वाले 4 बिट उपसर्ग शामिल हैं, इसके बाद 12 बिट डेटा होता है।
प्रारंभिक प्रयास थे कि एडीसी के पूरक को एडीसी पूरक बाइनरी को ऑफसेट करने के लिए मुझे दिया गया था, xor-ing analogin0.spihalfwords द्वारा [0] 0x8000 के साथ, परिणाम को नीचे 12 बिट्स पर शिफ्ट किया गया, और फिर अंकगणित को अंकगणितीय रूप से जोड़ा गया।
अविश्वसनीय रूप से निराशा होती है, जब तक कि मैं नहीं देखता कि analogin0.spibytes [0] = 0xFF और और analogin0.spibytes के लिए [1] = 0xB5, analogin0.halfwords [0] 0xB5FF के बराबर था और 0xFFB5 !!!!!
इसे नोट करने के बाद, मैंने अंकगणित संचालन और अर्धांश का उपयोग करना बंद कर दिया, और बिटवाइज़ लॉजिक और बाइट्स से चिपक गया
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 के बाद टेंप में झांकता हूं, तो सब अच्छा है
तो, सवालों के लिए ...
कोर्टेक्स मेरे लिए नया है। मुझे याद नहीं है कि पीआईसी ने कभी भी int16 में स्वैपिंग नहीं की है, भले ही दोनों प्लेटफॉर्म थोड़े ही एंडियन हैं। क्या ये सही है?
क्या इसे संभालने का अधिक सुरुचिपूर्ण तरीका है? यह बहुत अच्छा होगा अगर मैं एआरएम 7 को बड़े-एंडियन मोड में डाल सकता हूं। मैं कॉर्टेक्स एम 4 के कई संदर्भों को द्वि-एंडियन देख रहा हूं, लेकिन सभी स्रोत वास्तव में मुझे यह बताने से रोकते हैं । अधिक विशेष रूप से, मैं एसटीएम 32 एफ 407 को बड़े-एंडियन मोड में कैसे रखूं , भले ही यह जीसीसी में किया जा सके। क्या यह सिर्फ AIRCR रजिस्टर में उपयुक्त बिट सेट करने का मामला है? क्या कोई मेल-मिलाप है, जैसे कि कंपाइलर को मैच करने के लिए सेट करना है, या गणित स्क्रूअप बाद में असंगत पुस्तकालयों के साथ ??