| /**************************************************************************//**
 * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
 * [url=home.php?mod=space&uid=895143]@version[/url]  V2.10
 * $Date: 15/03/25 3:21p $
 * [url=home.php?mod=space&uid=247401]@brief[/url]    Sample Code for temperature sensor by GPIO 1wire.
 *
 * @note
 * Copyright (C) 2019 Nuvoton Technology Corp. All rights reserved.
 *
 ******************************************************************************/
#include <stdio.h>
#include <math.h>
#include "nano100series.h"
#define DQ      PD0
/*---------------------------------------------------------------------------------------------------------*/
/* Define global variables and constants                                                                   */
/*---------------------------------------------------------------------------------------------------------*/
volatile    uint16_t    g_u16Data;
volatile    uint8_t     g_u8DataH, g_u8DataL;
/* Initial DS18B20 */
uint8_t init_DS18B20(void)
{
    uint8_t flag = 0;
    /* TX rest pulse*/
    DQ = 0;
    CLK_SysTickDelay(480);
    /* Wait for DS18B20 response*/
    DQ = 1;
    CLK_SysTickDelay(100);
    /* Get response pulse*/
    if (DQ == 0)
        /* Detect DS18B20 success */
        flag = 1;
    else
        /* Detect DS18B20 fail */
        flag = 0;
    CLK_SysTickDelay(380);
    DQ = 1;
    return flag;
}
/* Write a byte to DS18B20 */
void writeDS18B20_byte(uint8_t u8wrData)
{
    uint8_t i;
    for (i = 0; i < 8; i++)
    {
        /* Start write status */
        DQ = 0;
        CLK_SysTickDelay(15);
        /* Write bit */
        DQ = u8wrData & 0x01;
        CLK_SysTickDelay(45);
        /* Release bus */
        DQ = 1;
        u8wrData >>= 1;
    }
}
/* Read a byte from DS18B20 */
uint8_t readDS18B20_byte(void)
{
    uint8_t i, u8rdData = 0;
    for (i = 0; i < 8; i++)
    {
        /* Start read status */
        DQ = 0;
        u8rdData >>= 1;
        DQ = 1;
        CLK_SysTickDelay(5);
        /* Read bit */
        if (DQ == 1)
            u8rdData |= 0x80;
        /* Wait bus in idle */
        CLK_SysTickDelay(60);
    }
    return (u8rdData);
}
/* Combine high byte data with low byte data as temperature data */
double DataCoding(uint16_t u16Data)
{
    double Temperature;
    uint8_t i;
    int8_t j;
    for (i = 0, j = -4; i < 12; i++, j++)
    {
        if (u16Data & 0x01)
            Temperature += pow(2, j);
        u16Data >>= 1;
    }
    return (Temperature);
}
void SYS_Init(void)
{
    /* Unlock protected registers */
    SYS_UnlockReg();
    /* Enable external HIRC */
    CLK_EnableXtalRC(CLK_PWRCTL_HIRC_EN_Msk);
    /* Waiting for clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_HIRC_STB_Msk);
    /* Set HCLK source form HIRC and HCLK source divide 1  */
    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_HCLK_CLK_DIVIDER(1));
    /* Select IP clock source */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HIRC, CLK_UART_CLK_DIVIDER(1));
    CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0_S_HIRC, 0);
    /* Enable IP clock */
    CLK_EnableModuleClock(UART0_MODULE);
    CLK_EnableModuleClock(TMR0_MODULE);
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Set PB multi-function pins for UART0 RXD and TXD */
    SYS->PB_L_MFP &= ~(SYS_PB_L_MFP_PB0_MFP_Msk | SYS_PB_L_MFP_PB1_MFP_Msk);
    SYS->PB_L_MFP |= (SYS_PB_L_MFP_PB0_MFP_UART0_RX | SYS_PB_L_MFP_PB1_MFP_UART0_TX);
    /* Lock protected registers */
    SYS_LockReg();
}
void UART0_Init()
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    UART_Open(UART0, 115200);
}
/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                           */
/*---------------------------------------------------------------------------------------------------------*/
int main(void)
{
    /* Init System, IP clock and multi-function I/O
       In the end of SYS_Init() will issue SYS_LockReg()
       to lock protected register. If user want to write
       protected register, please issue SYS_UnlockReg()
       to unlock protected register if necessary */
    SYS_Init();
    /* Init UART for printf */
    UART0_Init();
    printf("+-------------------------------------+ \n");
    printf("|    Temperature Sensor Sample Code   | \n");
    printf("+-------------------------------------+ \n");
    /*  Configure PD.0 as Open Drain mode for 1wire communication */
    GPIO_SetMode(PD, BIT0, GPIO_PMD_OPEN_DRAIN);
    PD0 = 1;
    /*-----------------------------------------------------------------------------------------------------*/
    /* DS18B20 Temperature Sensor test                                                                     */
    /*-----------------------------------------------------------------------------------------------------*/
    while (1)
    {
        /* Step 1: Initial DS18B20 */
        if (init_DS18B20())
        {
            /* Step 2: ROM Command */
            writeDS18B20_byte(0xCC);    /* Skip ROM command */
            /* Step 3: Function Command */
            writeDS18B20_byte(0x44);  /* Convert temperature */
            /* Delay for converting temperature */
            TIMER_Delay(TIMER0, 1000000);
            /* Step 1: Initial DS18B20 */
            if (init_DS18B20())
            {
                /* Step 2: ROM Command */
                writeDS18B20_byte(0xCC);    /* Skip ROM command */
                /* Step 3: Function Command */
                writeDS18B20_byte(0xBE);    /* Read temperature data*/
                /* Get low byte data of temperature*/
                g_u8DataL = readDS18B20_byte();
                /* Get high byte data of temperature*/
                g_u8DataH = (readDS18B20_byte() & 0x0f);
                /* Combine high byte data with low byte data */
                g_u16Data = (g_u8DataH << 8) | g_u8DataL;
                printf("Temperature raw data = %f\n", DataCoding(g_u16Data));
            }
        }
    }
}
/*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/
 
 |