আই 2 সি এসটিএম 32 এফ 0 এইচএল লাইব্রেরির সাথে নিবন্ধকদের সম্বোধন করছেন


12

আমি এসটিএম এর কিউব এবং এইচএল_ লাইব্রেরি ব্যবহার করতে খুব নতুন। আমি 32 টি পিন সহ একটি STM32F0 মাইক্রোকন্ট্রোলার ব্যবহার করছি। আই 2 সি এর জন্য স্কিম্যাটিকটি সঠিক। সুতরাং আমার এখানে একটু সাহায্য দরকার।

আমার একটি ক্যাপাসিটিভ সেন্সর রয়েছে ( এফডিসি 1004 ) যা আই 2 সি যোগাযোগ ব্যবহার করে। ডেটা পড়তে আমাকে এই রেজিস্টারগুলি লিখতে হবে।

আমি কীভাবে সঠিকভাবে START অনুরোধ ফর্ম মাস্টারকে দাসে প্রেরণ করতে পারি (দাসের ঠিকানাটি A0)?

0x0C রেজিস্ট্রারে কীভাবে পয়েন্টার সেট করবেন?

  • ডেটাশিট (0x0C নিবন্ধন করুন: বিট [7: 4]) থেকে 1 টি দেখুন sees আমি জানি না, কীভাবে এটি করা যায়? এবং শেষ পর্যন্ত একই রেজিস্টার থেকে কীভাবে পড়বেন?
  • প্লাস আমাকে পড়ার আগে DONE_x ক্ষেত্রটি অপেক্ষা করতে হবে (0x0C: বিটস [3: 0])?

তবে আমি জানি না যে আমি সঠিক রেজিস্টারগুলিতে সম্বোধন করছি! কারণ আমি সেন্সর থেকে কোনও তথ্য ফিরে পাই না!

আমার কোডটি এখানে:

int I2Ccomm ()
{

    HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x0C, 10, 100); //start bit and pointer to register
    HAL_Delay(50);
    HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x054, 10, 100); // setting the register
    HAL_Delay(50);

    HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x0C, 10, 100); //read from this register
    HAL_Delay(50);
    HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x02, 10, 100); //read data from register

    return ReadREG[1];
}

দয়া করে আরও নির্দিষ্ট প্রশ্ন (গুলি) জিজ্ঞাসা করুন। যেমন আমি কীভাবে এক্স রেজিস্টারটিকে ঠিকভাবে সম্বোধন করব? এটি একটি খারাপভাবে শব্দযুক্ত প্রশ্ন। আরও নির্দেশিকাগুলির জন্য দেখুন ইলেক্ট্রনিক্স.স্ট্যাকেক্সেঞ্জারএইচএলপি
ভোল্টেজ স্পাইক

তাহলে নতুন প্রশ্ন লিখতে বা এটিকে সম্পাদনা করা ভাল?
ইয়েস্ট 111

সম্পাদনা করা ভাল, কম প্রশ্ন এবং আমাদের এটিকে বন্ধ করতে হবে না।
ভোল্টেজ স্পাইক 18

উত্তর:


16

HAL_I2C_Master_Transmit()ফাংশন দিয়ে শুরু করা যাক । যদি আপনি এর ঘোষণাটি পরীক্ষা করেন:

 HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
  1. ২ য় প্যারামিটার, স্লেভ ডিভাইসের ঠিকানা দিয়ে ছোটখাটো সমস্যা । স্লেভ ডিভাইসের ঠিকানা হ'ল b1010000আমরা যদি এটি 8 বিট ফর্ম্যাটে পূরণ করি তবে 0xA0এটি যেমন হবে ঠিক তেমনই হবে । এখন এটি পাস করার সময় HAL_I2C_Master_Transmit()আপনাকে আর / ডাব্লু বিটটি ম্যানুয়ালি সেট করতে হবে না, এইচএএল এটি আপনার জন্য করবে। সুতরাং যখন আপনি HAL_I2C_Master_Transmit()সংক্রমণিত আর / ডাবল বিটটি কল করবেন তখন স্বয়ংক্রিয়ভাবে 0 লিখনের ক্রিয়াকলাপ নির্দেশ করে এবং যখন আপনি কল HAL_I2C_Master_Receive()করবেন তখন ট্রান্সমিশন আর / ডাব্লু বিটটি স্বয়ংক্রিয়ভাবে 1 টি লিখিত অপারেশন নির্দেশ করে । আপনি আর / ডাব্লু মানগুলি মিশ্রিত করেছেন তবে আমি মনে করি এটি ফাংশনটির জন্য কোনও যত্নশীল নয়, সুতরাং এটি আপনার কোডে একটি সত্যিকারের ত্রুটি নয়।

  2. 3 য় প্যারামিটার ( uint8_t *pData) একটি হল একটি বাফার পয়েন্টার যা রয়েছে তথ্য পাঠানো হবে । এখন, আপনার কলটিতে 3 য় প্যারামিটার হ'ল 0x0Cযা আপনার আসল তথ্য, নিবন্ধকের ঠিকানা। সমস্যাটি হ'ল এটি একটি পয়েন্টার হিসাবে (দ্বারা HAL_I2C_Master_Transmit()) একটি মেমোরি অবস্থানের কাছে ব্যাখ্যা করা হবে , যেখানে কিছু অপরিজ্ঞাত ডেটা পাওয়া যাবে।

  3. 4 র্থ প্যারামিটার বাফারের মাপ , বাইট সংখ্যা পাঠানো হবে। আপনি যদি একটি একক বাইট প্রেরণ করতে চান তবে এই প্যারামিটারটি 10 নয় 1 হওয়া উচিত ।

আমি2সি

রেজিস্টার লিখুন

এখানে ডেটাশিট থেকে সম্পর্কিত চিত্রটি দেওয়া হয়েছে।

এখানে চিত্র বর্ণনা লিখুন

সুতরাং বাসে স্লেভের ঠিকানা প্রেরণের পরে আরও তিনটি বাইট প্রেরণ করা উচিত: রেজিস্টার পয়েন্টার , এমএসবি বাইট , এলএসবি বাইট । এইচএএল লিখিত 16 বিট নিবন্ধের সাথে একটি সাধারণ বাস্তবায়ন:

void write_register(uint8_t register_pointer, uint16_t register_value)
{
    uint8_t data[3];

    data[0] = register_pointer;     // 0x0C in your example
    data[1] = register_value>>8;    // MSB byte of 16bit data
    data[2] = register_value;       // LSB byte of 16bit data

    HAL_I2C_Master_Transmit(&hi2c1, 0xA0, data, 3, 100);  // data is the start pointer of our array
}

আপনার মান সহ উদাহরণ: write_register(0x0C, 0x0054);

বিকল্পভাবে এইচএএল সংজ্ঞায়িত রেজিস্টার রাইটিং ফাংশনটিও ব্যবহার করা যেতে পারে, এতে নিবন্ধকের ঠিকানা এবং ঠিকানার আকার পাস করার জন্য অতিরিক্ত পরামিতি রয়েছে।

void write_register(uint8_t register_pointer, uint16_t register_value)
{
    HAL_StatusTypeDef status = HAL_OK;

    status = HAL_I2C_Mem_Write(&hi2c1, 0xA0, (uint16_t)register_pointer, I2C_MEMADD_SIZE_8BIT, (uint8_t*)(&register_value), 2, 100); 

    /* Check the communication status */
    if(status != HAL_OK)
    {
        // Error handling, for example re-initialization of the I2C peripheral
    }
}

এখন, HAL_I2C_Master_Receive()ফাংশনটি অন্যটির মতো প্রায় একই রকম।

HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);

কেবল পার্থক্য হ'ল তৃতীয় প্যারামিটারটি বাফারের একটি পয়েন্টার যেখানে প্রাপ্ত ডেটা সংরক্ষণ করা হবে। এটি 0x02আপনার কোডটিতে রয়েছে এবং আমি জানি না এটির সাথে আপনার উদ্দেশ্য কী ছিল তবে এটি পয়েন্টার হিসাবে ব্যাখ্যা করা হবে (দুর্ভাগ্যক্রমে একটি এলোমেলো স্মৃতি অবস্থানের জন্য)।

রেজিস্টার পড়ুন

এখানে চিত্র বর্ণনা লিখুন

আমি2সিআমি2সি

void read_register(uint8_t register_pointer, uint8_t* receive_buffer)
{
    // first set the register pointer to the register wanted to be read
    HAL_I2C_Master_Transmit(&hi2c1, 0xA0, &register_pointer, 1, 100);  // note the & operator which gives us the address of the register_pointer variable

    // receive the 2 x 8bit data into the receive buffer
    HAL_I2C_Master_Receive(&hi2c1, 0xA0, receive_buffer, 2, 100);   
}

উদাহরণ:

uint8_t reg_ptr = 0x0C;
uint8_t buffer[2];

read_register(reg_ptr, buffer);

// the register content available in the buffer

এছাড়াও একটি এইচএএল সংজ্ঞায়িত রেজিস্টার রিড ফাংশন রয়েছে যা রয়েছে।

uint16_t read_register(uint8_t register_pointer)
{
    HAL_StatusTypeDef status = HAL_OK;
    uint16_t return_value = 0;

    status = HAL_I2C_Mem_Read(&hi2c1, 0xA0, (uint16_t)register_pointer, I2C_MEMADD_SIZE_8BIT, &return_value, 2, 100);

    /* Check the communication status */
    if(status != HAL_OK)
    {

    }

    return return_value;
}

মাধ্যমে পড়া আরও তথ্যের জন্য ডেটাশিটের 8.5 প্রোগ্রামিং বিভাগের ।


আপনার উত্তরের জন্য ধন্যবাদ, এখন এটি শেষ পর্যন্ত কাজ করছে। তবে আরও একটি প্রশ্ন? আমাকে কি কয়েক মিলি সেকেন্ড পড়ার জন্য অপেক্ষা করতে হবে বা আমি কোনও দেরি না করে পড়তে পারি?
yest111

আমি মনে করি না যে কোনও বিলম্ব হওয়া প্রয়োজন, আপনি প্রথমটি ছাড়া চেষ্টা করতে পারেন।
বেনস কৌলিক্স

1
আপনার অপেক্ষা করার দরকার নেই, দাস সম্পূর্ণ না হওয়া অবধি আই 2 সি ক্লক সিগন্যালে লুপিং জড়িত।
মাহমুদ আল-কুদসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.