चलिए 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);
दूसरे पैरामीटर के साथ मामूली समस्या , दास डिवाइस का पता। गुलाम डिवाइस का पता b1010000
अगर हम इसे 8bit प्रारूप में पूरा करते हैं, तो यह वैसा ही होगा 0xA0
, जैसा आपने कहा था। अब HAL_I2C_Master_Transmit()
इसे पास करते समय आपको मैन्युअल रूप से आर / डब्ल्यू बिट सेट करने की आवश्यकता नहीं है, एचएएल यह आपके लिए करेगा। इसलिए जब आप HAL_I2C_Master_Transmit()
प्रेषित आर / डब्ल्यू बिट कहते हैं , तो स्वचालित रूप से लिखित कार्रवाई का संकेत 0 होगा और जब आप HAL_I2C_Master_Receive()
प्रेषित आर / डब्ल्यू बिट को स्वचालित रूप से कॉल करेंगे, तो स्वचालित रूप से लिखने का संकेत देने वाला 1 संकेत होगा । आपने R / W मान मिलाया है, लेकिन मुझे लगता है कि यह फ़ंक्शन की परवाह नहीं करता है, इसलिए यह आपके कोड में वास्तविक त्रुटि नहीं है।
3 पैरामीटर ( uint8_t *pData
) एक है एक बफर करने के लिए सूचक जिसमें डेटा भेजे जाने के लिए । अब, आपके कॉल में 3rd पैरामीटर 0x0C
जो आपका वास्तविक डेटा है, रजिस्टर एड्रेस है। समस्या यह है, यह HAL_I2C_Master_Transmit()
एक मेमोरी स्थान पर एक पॉइंटर (द्वारा ) के रूप में व्याख्या की जाएगी , जहां कुछ अपरिभाषित डेटा मिल सकते हैं।
4 पैरामीटर है बफर के आकार , बाइट की संख्या भेजे जाने के लिए। यदि आप एक भी बाइट भेजना चाहते हैं तो यह पैरामीटर 1 होना चाहिए न कि 10।
मैं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*)(®ister_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सी रीड ऑपरेशन, 16 बिट डेटा वापस पढ़ें।
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, ®ister_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 प्रोग्रामिंग सेक्शन के माध्यम से पढ़ें ।