আমি একটি এসটিএম 32 এফ 4 ডিস্কোভারি প্রোগ্রাম করার জন্য আর্ম জিসিসি (কোকক্স) ব্যবহার করছি এবং আমি ডাব্লু / এন্ডিয়ান সমস্যা নিয়ে কুস্তি করছি
আমি এসপিআইয়ের মাধ্যমে 24 বিট এডিসি দিয়ে নমুনা দিচ্ছি। যেহেতু তিনটি বাইট আসছে, এমএসবি প্রথমে এগুলি তৈরির জন্য ইউনিয়নে লোড করার ধারণাটি পেয়েছিলাম (আমি আশা করি, যাইহোক!) ব্যবহার করা কিছুটা সহজ।
typedef union
{
int32_t spilong;
uint8_t spibytes [4];
uint16_t spihalfwords [2];} spidata;
spidata analogin0;
আমি স্পি ব্যবহার করে ডেটা লোড করে এনালগিন0.স্পাইবাইটে পড়ি [0] - [2], এমএসবি হিসাবে [0] দিয়ে, তারপর আমি ইউএসআর্টের মাধ্যমে একবারে 8 বিট করে তাদের থুতু দিয়েছি। কোন সমস্যা নাই.
সমস্যাগুলি শুরু হয়েছিল যখন আমি একটি 12 বিট ড্যাকের মধ্যে ডেটাটি দেওয়ার চেষ্টা করেছি। এই এসপিআই ড্যাকটি 16 বিট শব্দ চায়, যা এমএসবি থেকে শুরু করে একটি 4 বিট উপসর্গ নিয়ে থাকে এবং তারপরে 12 বিট ডেটা থাকে।
প্রাথমিক চেষ্টাগুলি ছিল এডিসি আমাকে দ্বিগুণ পরিপূরক হিসাবে বাইনারি অফসেটে রূপান্তরিত করে, xor-ing analogin0.spihalfwords [0] দিয়ে 0x8000 দিয়ে ফলাফলটি নীচে 12 বিটে স্থানান্তরিত করে এবং পরে গাণিতিকভাবে উপসর্গ যুক্ত করে।
অবিশ্বাস্যরূপে হতাশাব্যঞ্জক, যতক্ষণ না আমি খেয়াল করি যে এনালগিন0.স্পাইবাইট [0] = 0xFF এবং এবং এনালগিন0.স্পাইবাইটস [1] = 0xB5, এনালগিন0.এলফवर्डস [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 নয়, তাই সমস্ত ভাল
সুতরাং, প্রশ্নের জন্য ...
কর্টেক্স আমার কাছে নতুন। উভয় প্ল্যাটফর্মটি সামান্য এডিয়ান হলেও, আমি পিআইসিকে ইনট 16 এর অদলবদল কখনও স্মরণ করতে পারি না। এটা কি সঠিক?
এটি পরিচালনা করার জন্য আরও কি মার্জিত উপায় আছে? এটি দুর্দান্ত হবে যদি আমি কেবল এআরএম 7 বিগ-এন্ডিয়ান মোডে রাখতে পারি। আমি কর্টেক্স এম 4 এর দ্বি-এন্ডিয়ান হিসাবে অনেকগুলি উল্লেখ দেখতে পাচ্ছি, তবে সমস্ত উত্স আসলে কীভাবে আমাকে তা বলার অপেক্ষা রাখে না বলে মনে হয় । আরও সুনির্দিষ্টভাবে, আমি কীভাবে STM32f407 কে বড়-এন্ডিয়ান মোডে রাখি , এটি আরও ভাল যদি এটি জিসিসিতে করা যায় । এটি কি এআইআরসিআর রেজিস্টারে উপযুক্ত বিট স্থাপনের বিষয়? কোনও র্যামফিকেশন রয়েছে, যেমন ম্যাচের জন্য সংকলকটি সেট করতে হবে, বা গণিতের স্ক্রুআপগুলি পরে অসামঞ্জস্য লাইব্রেরি সহ ??