Saya sangat baru menggunakan CUBE dan HAL_libraries STM. Saya menggunakan mikrokontroler STM32F0 dengan 32 pin. Skema untuk I2C benar. Jadi saya butuh sedikit bantuan di sini.
Saya memiliki sensor kapasitif ( FDC1004 ) yang menggunakan komunikasi I2C. Saya harus menulis register ini untuk membaca data.
Bagaimana saya bisa mengirim master formulir permintaan START ke slave dengan benar (alamat slave A0)?
Bagaimana cara mengatur pointer ke register 0x0C?
- Datasheet melihat (Daftarkan 0x0C: bit [7: 4]) ke 1.) Saya tidak tahu, bagaimana cara melakukannya? Dan akhirnya bagaimana BACA dari register yang sama?
- Ditambah lagi, saya harus menunggu bidang DONE_x (Daftar 0x0C: bit [3: 0]) sebelum saya membacanya?
Tapi saya tidak tahu apakah saya menangani register yang tepat! Karena saya tidak mendapatkan data apa pun dari sensor!
Ini kode saya:
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];
}
microcontroller
i2c
stm32
stm32f0
hal-library
yest111
sumber
sumber
Jawaban:
Mari kita mulai dengan
HAL_I2C_Master_Transmit()
fungsinya. Jika Anda memeriksa deklarasi:Masalah kecil dengan parameter ke - 2 , alamat perangkat slave. Alamat perangkat slave adalah
b1010000
jika kita melengkapi ke format 8bit, itu akan menjadi0xA0
, seperti yang Anda katakan. Sekarang ketika meneruskan ini kepadaHAL_I2C_Master_Transmit()
Anda tidak harus mengatur bit R / W secara manual, HAL akan melakukannya untuk Anda. Jadi ketika Anda memanggilHAL_I2C_Master_Transmit()
bit R / W yang ditransmisikan akan secara otomatis 0 mengindikasikan operasi tulis dan ketika Anda memanggilHAL_I2C_Master_Receive()
bit R / W yang ditransmisikan akan secara otomatis 1 mengindikasikan operasi tulis . Anda telah mencampur nilai-nilai R / W tetapi saya pikir ini sedikit tidak peduli untuk fungsi, jadi itu bukan kesalahan aktual dalam kode Anda.Parameter ke - 3 (
uint8_t *pData
) adalah penunjuk ke buffer yang berisi data yang akan dikirim . Sekarang, dalam panggilan Anda, parameter ke - 3 adalah0x0C
data aktual Anda, alamat register. Masalahnya adalah, itu akan ditafsirkan sebagai pointer (olehHAL_I2C_Master_Transmit()
) ke lokasi memori, di mana beberapa data yang tidak ditentukan dapat ditemukan.Parameter ke - 4 adalah ukuran buffer , jumlah byte yang akan dikirim. Jika Anda ingin mengirim satu byte maka parameter ini harus 1 dan bukan 10.
Tulis register
Berikut adalah diagram yang sesuai dari lembar data.
Jadi setelah mengirim alamat slave ke bus, tiga byte lagi harus dikirim: register pointer , MSB byte , LSB byte . Implementasi umum dengan register HAL menulis 16bit:
Contoh dengan nilai-nilai Anda:
write_register(0x0C, 0x0054);
Atau, fungsi tulis register HAL yang ditentukan dapat digunakan juga, yang memiliki parameter tambahan untuk meneruskan alamat register dan ukuran alamat.
Sekarang,
HAL_I2C_Master_Receive()
fungsinya hampir sama dengan yang lain.Satu-satunya perbedaan adalah bahwa parameter ke - 3 adalah pointer ke buffer di mana data yang diterima akan disimpan. Ada
0x02
dalam kode Anda dan saya tidak tahu apa tujuan Anda dengan itu, tetapi itu akan ditafsirkan sebagai pointer (sayangnya ke lokasi memori acak).Baca register
Contoh:
Ada juga fungsi baca register HAL didefinisikan juga, yang memiliki.
Baca melalui 8.5 Bagian pemrograman pada lembar data untuk detail lebih lanjut.
sumber