informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Daftar isi
1 Perangkat lunak dan perangkat keras
1.1 Informasi lingkungan perangkat lunak dan perangkat keras
1.2 Informasi papan pengembangan
2.1 Rangkaian antarmuka perangkat keras
2.2 FSB mengkonfigurasi IO DS18B20
3.2 implementasi driver DS18B20
3.2.2 Membaca fungsi status IO
Renesas R7FA8D1BH (Cortex®-M85) mengontrol DS18B20 dan ADC untuk mencapai fungsi lompatan dua halaman
Artikel ini terutama memperkenalkan kasus aplikasi komprehensif yang dirancang untuk Renesas R7FA8D1BH (Cortex®-M85): menerapkan IO R7FA8D1BH untuk mengimplementasikan protokol bus tunggal dan mewujudkan fungsi mengemudi ds18b20 ditampilkan pada OLED di layar. Data suhu juga dikirim ke terminal port serial melalui terminal port serial.
Informasi perangkat lunak dan perangkat keras | Informasi Versi |
---|---|
MCU Renesas | R7FA8D1BH |
Keil | MDK ARM 5.38 |
versi FSP | 5.3.0 |
Alat debug: N32G45XVL-STB | Tautan DAP |
Penulis memilih untuk menggunakan papan pengembangan Wildfire Yaoyang_Renesas RA8. MCU kontrol utama papan ini adalah R7FA8D1BHECBD, dan inti dari 7FA8D1BHECBD adalah ARM Contex-M85.
Untuk chip R7FA8D1BHECBD, core yang digunakan adalah Cortex®-M85 Core, ST-LINK-V2 atau J-LINK-V9 tidak mendukung fungsi download dan debugging.Setelah berkali-kali mencoba, penulis menemukannyaN32G45XVL-STBDAP-LINK yang disertakan dengan board dapat mengunduh dan men-debug R7FA8D1BHECBD.
Gambar di bawah ini adalah gambar fisik papan pengembangan N32G45XVL-STB:
Rangkaian antarmuka DS18B20 telah dirancang pada Yaoyang Development Board_Renesas RA8, yang menggunakan antarmuka P809 sebagai sinyal kontrol DQ DS18B20.
Konfigurasikan P809 sebagai antarmuka IO umum, lalu konfigurasikan secara dinamis status keluaran atau keluaran IO dalam kode
Setelah menyelesaikan konfigurasi parameter FSP, Anda dapat Menghasilkan Proyek. Buka file proyek, strukturnya sebagai berikut:
Buat file ds18b20.c untuk mengimplementasikan kode driver
Pada artikel sebelumnya, penulis telah menganalisis timing dan logika implementasi DS18B20 secara detail, jadi saya tidak akan memperkenalkannya di sini.
Catatan Aplikasi DS18B20_Bentuk gelombang ds18b20 membaca data-Blog CSDN
Baris 14 kode: Tentukan fungsi penundaan langkah kami
Baris 15 kode: Tentukan fungsi penundaan langkah ms
Baris 18 kode: Tentukan PIN IO DS18B20
Baris 21 kode: Konfigurasi port input
Baris 22 kode: Konfigurasi port keluaran
Baris 24 kode: Atur IO level rendah
Baris 25 kode: Tetapkan IO tingkat tinggi
Baris 47 kode: Membaca status IO dalam mode input
Fungsi: ds18b20Init, mendeteksi apakah DS18B20 sedang online
Fungsi: ds18b20BlockModeProses. Baca nilai DS18B20
- /**
- * @brief reset DS18B20
- * @note if reset ds18b20 sucess, the return value is TRUE
- * @param None
- * @retval True or Flalse
- */
- static uint8_t ds18b20Init( void )
- {
- uint16_t tempCnt = 0;
- bsp_io_level_t status;
-
- // Set PIN mode output
- DS_Mode_Out_PP();
-
- // Master pin is high
- DQ_SET_HIGH;
- timeDelayUS(10);
-
- // Master pin is low
- DQ_SET_LOW;
- // wait for 600 us
- timeDelayUS(750);
-
- // Set PIN mode input
- DS_Mode_IN_PUT();
-
- while(1)
- {
- status = DQ_RAD_PIN();
- if( status == 0)
- {
- tempCnt = 0;
- return TRUE;
- }
- else
- {
- timeDelayUS(1);
- tempCnt++;
- if( tempCnt > 480 )
- return FALSE;
- }
- }
- }
-
-
- static uint8_t readBit( void )
- {
- uint8_t readCnt = 2;
- uint8_t bitVal = 1;
-
- DQ_SET_LOW;
- timeDelayUS(3);
- DQ_SET_HIGH;
-
- timeDelayUS(5); // 15 us
-
- while(readCnt-- )
- {
- //read DQ value
- if( DQ_RAD_PIN() == 0)
- {
- bitVal = 0;
- }
- timeDelayUS(2); // 15 us
- }
-
- timeDelayUS(30); // 15 us
-
- return bitVal;
- }
-
- static uint8_t ds18b20ReadByte( void )
- {
- uint8_t byteVal = 0;
-
- for ( uint8_t i = 0; i < 8; i++ )
- {
- byteVal >>= 1;
-
- uint8_t bitVal = readBit();
- if( bitVal > 0)
- {
- byteVal |= 0x80;
- }
- }
-
- return byteVal;
- }
-
-
- /**
- * @brief write one byte to DS18B20
- * @note
- * @param byte: the data that is sended to ds18b20
- * @retval None
- */
- void ds18b20WriteByte( uint8_t byte)
- {
- unsigned char k;
-
- // Set PIN mode output
- DS_Mode_Out_PP();
-
- for ( k = 0; k < 8; k++ )
- {
- if (byte & (1<<k))
- {
- DQ_SET_LOW;
- timeDelayUS(2);
-
- DQ_SET_HIGH;
- timeDelayUS(65);
- }
- else
- {
- DQ_SET_LOW;
- timeDelayUS(65);
-
- DQ_SET_HIGH;
- timeDelayUS(2);
- }
- }
- }
-
- uint8_t ds18b20BlockModeProcess( void )
- {
- uint16_t tempValue;
- uint8_t tempL, tempH;
-
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
-
- // wait for 600 us
- timeDelayUS(600);
-
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0x44); // start convert temperature
-
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
- // wait for 600 us
- timeDelayUS(600);
-
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0xbe); // read temperature data register
-
- tempL = ds18b20ReadByte();
- tempH = ds18b20ReadByte();
-
- if (tempH > 0x7f)
- {
- tempL = ~tempL;
- tempH = ~tempH+1;
- st_ds1b20val.sign = 1;
- }
-
- tempValue = (uint16_t)((tempH << 8) | tempL);
-
- st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);
-
- return TRUE;
- }
-
-
- // NO blocking mode operate ds18b20
- uint8_t ds18b20NoBlockingProcess( void )
- {
- uint16_t tempValue;
- static uint16_t waitCnt = 0;
- uint8_t tempL, tempH;
- static uint8_t runState = 0;
-
- switch( runState )
- {
- default:
- case INIT_DQ:
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
- runState = WAIT_READY;
- break;
-
- case WAIT_READY:
- timeDelayUS(2); // IDEL
- runState = SKIDROM_CMD;
- break;
-
- case SKIDROM_CMD:
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0x44); // begin to convert temperature data
- waitCnt = 0;
- runState = WAIT_CONVERT;
- break;
-
- case WAIT_CONVERT:
- waitCnt++;
- if( waitCnt > WAIT_CNT_CONVERT)
- {
- waitCnt = 0;
- runState = RESET_CMD;
- }
- break;
-
- case RESET_CMD:
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
- runState = WAIT_DATA_READY;
- break;
-
- case WAIT_DATA_READY:
- timeDelayUS(2); // IDEL
- runState = READ_CMD;
- break;
-
- case READ_CMD:
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0xbe); // read temperature data register
- runState = GET_VALUE;
- break;
-
- case GET_VALUE:
-
- tempL = ds18b20ReadByte();
- tempH = ds18b20ReadByte();
-
- if (tempH > 0x7f)
- {
- tempL = ~tempL;
- tempH = ~tempH+1;
- st_ds1b20val.sign = 1;
- }
-
- tempValue = (uint16_t)((tempH << 8) | tempL);
-
- st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);
- runState = INIT_DQ;
- return TRUE;
- }
-
- return FALSE;
- }
Baris 113 kode: Baca nilai ds18b20
Baris kode 130: Dapatkan data hasil ds18b20
Baris 131 kode: Data tampilan yang diformat
Baris 132 kode: Menampilkan data pada OLED
Kompilasi kode dan unduh kode ke papan. Hasil yang berjalan adalah sebagai berikut:
Kode driver DS18B20
1) Buat file ds18b20.c dan tulis kode berikut
- /*
- FILE NAME : ds18b20.c
- Description: user ds18b20 interface
- Author : [email protected]
- Date : 2024/06/03
- */
- #include "ds18b20.h"
- #include "hal_data.h"
-
- typedef enum{
- INPUT = 0,
- OUTPUT = 1,
- }IO_TYPE;
-
- typedef enum{
- FALSE = 0,
- TRUE = 1,
- }RETURN_RESULT;
-
- typedef enum{
- INIT_DQ = 0,
- WAIT_READY,
- SKIDROM_CMD,
-
- WAIT_CONVERT,
- RESET_CMD,
- READ_CMD,
-
- WAIT_DATA_READY,
- GET_VALUE,
- IDLE_NULL
- }RUN_STATE;
-
- ds18b20Struc st_ds1b20val;
-
-
- ds18b20Struc get_ds18b20_value( void )
- {
- return st_ds1b20val;
- }
-
- static bsp_io_level_t DQ_RAD_PIN(void)
- {
- bsp_io_level_t state;
-
- // READ io
- R_IOPORT_PinRead(&g_ioport_ctrl, DS_IO_PORT_PIN, &state);
-
- return state;
- }
-
- /**
- * @brief reset DS18B20
- * @note if reset ds18b20 sucess, the return value is TRUE
- * @param None
- * @retval True or Flalse
- */
- static uint8_t ds18b20Init( void )
- {
- uint16_t tempCnt = 0;
- bsp_io_level_t status;
-
- // Set PIN mode output
- DS_Mode_Out_PP();
-
- // Master pin is high
- DQ_SET_HIGH;
- timeDelayUS(10);
-
- // Master pin is low
- DQ_SET_LOW;
- // wait for 600 us
- timeDelayUS(750);
-
- // Set PIN mode input
- DS_Mode_IN_PUT();
-
- while(1)
- {
- status = DQ_RAD_PIN();
- if( status == 0)
- {
- tempCnt = 0;
- return TRUE;
- }
- else
- {
- timeDelayUS(1);
- tempCnt++;
- if( tempCnt > 480 )
- return FALSE;
- }
- }
- }
-
-
- static uint8_t readBit( void )
- {
- uint8_t readCnt = 2;
- uint8_t bitVal = 1;
-
- DQ_SET_LOW;
- timeDelayUS(3);
- DQ_SET_HIGH;
-
- timeDelayUS(5); // 15 us
-
- while(readCnt-- )
- {
- //read DQ value
- if( DQ_RAD_PIN() == 0)
- {
- bitVal = 0;
- }
- timeDelayUS(2); // 15 us
- }
-
- timeDelayUS(30); // 15 us
-
- return bitVal;
- }
-
- static uint8_t ds18b20ReadByte( void )
- {
- uint8_t byteVal = 0;
-
- for ( uint8_t i = 0; i < 8; i++ )
- {
- byteVal >>= 1;
-
- uint8_t bitVal = readBit();
- if( bitVal > 0)
- {
- byteVal |= 0x80;
- }
- }
-
- return byteVal;
- }
-
-
- /**
- * @brief write one byte to DS18B20
- * @note
- * @param byte: the data that is sended to ds18b20
- * @retval None
- */
- void ds18b20WriteByte( uint8_t byte)
- {
- unsigned char k;
-
- // Set PIN mode output
- DS_Mode_Out_PP();
-
- for ( k = 0; k < 8; k++ )
- {
- if (byte & (1<<k))
- {
- DQ_SET_LOW;
- timeDelayUS(2);
-
- DQ_SET_HIGH;
- timeDelayUS(65);
- }
- else
- {
- DQ_SET_LOW;
- timeDelayUS(65);
-
- DQ_SET_HIGH;
- timeDelayUS(2);
- }
- }
- }
-
- uint8_t ds18b20BlockModeProcess( void )
- {
- uint16_t tempValue;
- uint8_t tempL, tempH;
-
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
-
- // wait for 600 us
- timeDelayUS(600);
-
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0x44); // start convert temperature
-
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
- // wait for 600 us
- timeDelayUS(600);
-
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0xbe); // read temperature data register
-
- tempL = ds18b20ReadByte();
- tempH = ds18b20ReadByte();
-
- if (tempH > 0x7f)
- {
- tempL = ~tempL;
- tempH = ~tempH+1;
- st_ds1b20val.sign = 1;
- }
-
- tempValue = (uint16_t)((tempH << 8) | tempL);
-
- st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);
-
- return TRUE;
- }
-
-
- // NO blocking mode operate ds18b20
- uint8_t ds18b20NoBlockingProcess( void )
- {
- uint16_t tempValue;
- static uint16_t waitCnt = 0;
- uint8_t tempL, tempH;
- static uint8_t runState = 0;
-
- switch( runState )
- {
- default:
- case INIT_DQ:
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
- runState = WAIT_READY;
- break;
-
- case WAIT_READY:
- timeDelayUS(2); // IDEL
- runState = SKIDROM_CMD;
- break;
-
- case SKIDROM_CMD:
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0x44); // begin to convert temperature data
- waitCnt = 0;
- runState = WAIT_CONVERT;
- break;
-
- case WAIT_CONVERT:
- waitCnt++;
- if( waitCnt > WAIT_CNT_CONVERT)
- {
- waitCnt = 0;
- runState = RESET_CMD;
- }
- break;
-
- case RESET_CMD:
- if (ds18b20Init() == FALSE)
- {
- return FALSE;
- }
- runState = WAIT_DATA_READY;
- break;
-
- case WAIT_DATA_READY:
- timeDelayUS(2); // IDEL
- runState = READ_CMD;
- break;
-
- case READ_CMD:
- ds18b20WriteByte(0xcc);
- ds18b20WriteByte(0xbe); // read temperature data register
- runState = GET_VALUE;
- break;
-
- case GET_VALUE:
-
- tempL = ds18b20ReadByte();
- tempH = ds18b20ReadByte();
-
- if (tempH > 0x7f)
- {
- tempL = ~tempL;
- tempH = ~tempH+1;
- st_ds1b20val.sign = 1;
- }
-
- tempValue = (uint16_t)((tempH << 8) | tempL);
-
- st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);
- runState = INIT_DQ;
- return TRUE;
- }
-
- return FALSE;
- }
-
-
-
- /* End of this file */
2) Buat file ds18b20.h dan tulis kode berikut
- /*
- FILE NAME : ds18b20.h
- Description: user ds18b20 interface
- Author : [email protected]
- Date : 2024/06/03
- */
- #ifndef DS18B20_H
- #define DS18B20_H
- #include "hal_data.h"
-
-
- #define WAIT_CNT_CONVERT 500
-
- #define timeDelayUS(us) R_BSP_SoftwareDelay(us, BSP_DELAY_UNITS_MICROSECONDS);
- #define DS_DELAY_MS(ms) R_BSP_SoftwareDelay(ms, BSP_DELAY_UNITS_MILLISECONDS);
-
-
- #define DS_IO_PORT_PIN BSP_IO_PORT_08_PIN_09
-
-
- #define DS_Mode_IN_PUT() R_IOPORT_PinCfg(&g_ioport_ctrl, DS_IO_PORT_PIN, IOPORT_CFG_PORT_DIRECTION_INPUT)
- #define DS_Mode_Out_PP() R_IOPORT_PinCfg(&g_ioport_ctrl, DS_IO_PORT_PIN, IOPORT_CFG_PORT_DIRECTION_OUTPUT)
-
- #define DQ_SET_LOW R_IOPORT_PinWrite(&g_ioport_ctrl, DS_IO_PORT_PIN, BSP_IO_LEVEL_LOW)
- #define DQ_SET_HIGH R_IOPORT_PinWrite(&g_ioport_ctrl, DS_IO_PORT_PIN, BSP_IO_LEVEL_HIGH)
-
-
- typedef struct{
- float temperatureVal;
- bool sign;
- }ds18b20Struc;
-
- uint8_t ds18b20BlockModeProcess( void );
- ds18b20Struc get_ds18b20_value( void );
-
-
- #endif /* DS18B20_H */
-
-