打印
[应用方案]

使用新唐NUC120 实现的一个 MODBUS的例程

[复制链接]
3300|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangjiahao88|  楼主 | 2018-3-7 11:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "Driver\DrvSYS.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvUART.h"
//
#include "Driver\MODBUS.h"
#include "Driver\TIMINIT.h"
#include "Driver\DISPLAY.h"
#include "Driver\PCA9698DGG.h"
#include "Driver\MYFUN.h"

沙发
wangjiahao88|  楼主 | 2018-3-7 11:02 | 只看该作者
int main(void) {
        REG32WRITE(SYS->IPRSTC1, CPU_RST, 1);
        REG32WRITE(SYS->IPRSTC1, CHIP_RST, 1);
        SYSinit();
        TimerInit();
        modbusinit(19200, 1);
        DataInit();
        DrvGPIO_InitFunction(FUNC_I2C0); //PCA9698初始化,设置相应的IO口为输入输出状态。
        PCA9698init();
//        InitLCD();
        while (1) {
                DrvUART_EnableInt(UART_PORT0, (DRVUART_RLSNT | DRVUART_RDAINT
                                | DRVUART_THREINT), UART0_INT_HANDLE);
                checkComm0Modbus(Tick_10ms);
DELAY(5000);
                //
                //                DispFloat(1, 0, receCount, 0);
                //                DispFloat(2, 0, receBuf[receCount], 0);
                //                DispFloat(0, 4, sendPosi, 0);
                //                DispFloat(1, 4, sendCount, 0);
//                                DispFloat(0, 0, checkoutError, 0);
//                                DispFloat(1, 0, DrvUART_GetIntStatus(UART_PORT0, DRVUART_BUFERRINT), 0);

                                //                DispFloat(2, 6, sendBuf[1], 0);
                //                DispFloat(3, 4, receBuf[1], 0);
//                DispFloat(3, 6, Register[1], 0);

//手动按钮控制
Coil[1] ? D1ON : D1OFF;
Coil[2] ? D2ON : D2OFF;
Coil[3] ? D3ON : D3OFF;
Coil[4] ? D4ON : D4OFF;
Coil[5] ? D5ON : D5OFF;
Coil[6] ? D6ON : D6OFF;
Coil[7] ? D7ON : D7OFF;
Coil[8] ? D8ON : D8OFF;
//
Coil[9] ? D9ON : D9OFF;
Coil[10] ? D10ON : D10OFF;
Coil[11] ? D11ON : D11OFF;
Coil[12] ? D12ON : D12OFF;
Coil[13] ? D13ON : D13OFF;
Coil[14] ? D14ON : D14OFF;
Coil[15] ? D15ON : D15OFF;
Coil[16] ? D16ON : D16OFF;
//
Coil[17] ? D17ON : D17OFF;
Coil[18] ? D18ON : D18OFF;
Coil[19] ? D19ON : D19OFF;
Coil[20] ? D20ON : D20OFF;
//
Coil[21] ? D21ON : D21OFF;
Coil[22] ? D22ON : D22OFF;
Coil[23] ? D23ON : D23OFF;
Coil[24] ? D24ON : D24OFF;
Coil[25] ? D25ON : D25OFF;
Coil[26] ? D26ON : D26OFF;
Coil[27] ? D27ON : D27OFF;
Coil[28] ? D28ON : D28OFF;
Coil[29] ? D29ON : D29OFF;
Coil[30] ? D30ON : D30OFF;


        }
}

使用特权

评论回复
板凳
wangjiahao88|  楼主 | 2018-3-7 11:03 | 只看该作者
开发工具 用的是 COIDE!

五六年前 以前开发的了!

使用特权

评论回复
地板
wangjiahao88|  楼主 | 2018-3-7 11:05 | 只看该作者
LED 12864 的显示部分

代码如下 很简单的 ST7920控制

使用特权

评论回复
5
wangjiahao88|  楼主 | 2018-3-7 11:06 | 只看该作者
#ifndef DISPLAY_H
#define DISPLAY_H
#include "Driver\MYFUN.h"
//
//#define CSL  DrvGPIO_ClrBit(GPC,4)
//#define CSH  DrvGPIO_SetBit(GPC,4)
//#define SIDL DrvGPIO_ClrBit(GPC,5)
//#define SIDH DrvGPIO_SetBit(GPC,5)
//#define CLKL DrvGPIO_ClrBit(GPD,15)
//#define CLKH DrvGPIO_SetBit(GPD,15)

#define CSL DrvGPIO_ClrBit(GPD,5)
#define CSH DrvGPIO_SetBit(GPD,5)
#define SIDL DrvGPIO_ClrBit(GPD,3)
#define SIDH DrvGPIO_SetBit(GPD,3)
#define CLKL DrvGPIO_ClrBit(GPD,1)
#define CLKH DrvGPIO_SetBit(GPD,1)
//定义延时时间
#define DlyTime 10

使用特权

评论回复
6
wangjiahao88|  楼主 | 2018-3-7 11:06 | 只看该作者
//写指令
void SendCommand(uint8_t CommandData) //Send Command
{
        uint8_t i;
        uint8_t iData, TempData1, TempData2;
        iData = 0xf8;
        TempData1 = (CommandData & 0xf0);
        TempData2 = (CommandData & 0x0f);
        TempData2 <<= 4;
        DELAY(DlyTime);
        CSL;
        DELAY(3);
        CLKL;
        DELAY(3);
        SIDL;
        DELAY(3);
        CSH;
        DELAY(3);
        for (i = 0; i < 8; i++) {
                if ((iData & 0x80) != 0)
                        SIDH;
                        else
                        SIDL;
                DELAY(3);
                CLKH;
                DELAY(3);
                CLKL;
                DELAY(3);
                iData = iData << 1;
        }
        for (i = 0; i < 8; i++) {
                if ((TempData1 & 0x80) != 0)
                        SIDH;
                        else
                        SIDL;
                DELAY(3);
                CLKH;
                DELAY(3);
                CLKL;
                DELAY(3);
                TempData1 <<= 1;
        }
        for (i = 0; i < 8; i++) {
                if ((TempData2 & 0x80) != 0)
                        SIDH;
                        else
                        SIDL;
                DELAY(3);
                CLKH;
                DELAY(3);
                CLKL;
                DELAY(3);
                TempData2 <<= 1;
        }
        CSL;
        DELAY(3);
        SIDH;
        DELAY(3);
}

使用特权

评论回复
7
wangjiahao88|  楼主 | 2018-3-7 11:07 | 只看该作者
//写字节
void SendData(uint8_t CommandData) //Send Data
{
        uint8_t i;
        uint8_t iData, TempData1, TempData2;
        iData = 0xfa;
        TempData1 = (CommandData & 0xf0);
        TempData2 = (CommandData & 0x0f);
        TempData2 <<= 4;
        DELAY(DlyTime);
        CSL;
        DELAY(3);
        CLKL;
        DELAY(3);
        SIDL;
        DELAY(3);
        CSH;
        DELAY(3);
        for (i = 0; i < 8; i++) {
                if ((iData & 0x80) != 0)
                        SIDH;
                        else
                        SIDL;
                DELAY(3);
                CLKH;
                DELAY(3);
                CLKL;
                DELAY(3);
                iData = iData << 1;
        }
        for (i = 0; i < 8; i++) {
                if ((TempData1 & 0x80) != 0)
                        SIDH;
                        else
                        SIDL;
                DELAY(3);
                CLKH;
                DELAY(3);
                CLKL;
                DELAY(3);
                TempData1 <<= 1;
        }
        for (i = 0; i < 8; i++) {
                if ((TempData2 & 0x80) != 0)
                        SIDH;
                        else
                        SIDL;
                DELAY(3);
                CLKH;
                DELAY(3);
                CLKL;
                DELAY(3);
                TempData2 <<= 1;
        }
        CSL;
        DELAY(3);
        SIDH;
        DELAY(3);

}

使用特权

评论回复
8
wangjiahao88|  楼主 | 2018-3-7 11:07 | 只看该作者
//初始化LCD
void InitLCD() //LCD Init
{
        DELAY(10);
        SendCommand(0x30);
        DELAY(10);
        SendCommand(0x0c);
        DELAY(10);
        SendCommand(0x01);
        DELAY(10);
}

使用特权

评论回复
9
wangjiahao88|  楼主 | 2018-3-7 11:07 | 只看该作者
//刷新屏幕
void lcdclr() {
        DELAY(5);
        SendCommand(0x01);
        DELAY(5);
        SendCommand(0x34);
        DELAY(5);
        SendCommand(0x30);
}

使用特权

评论回复
10
wangjiahao88|  楼主 | 2018-3-7 11:08 | 只看该作者
//显示图画
void pic_Disp(uint8_t *pic) //显示Gdram内容(显示图片)
{
        uint8_t x, y, i;
        for (i = 0; i < 9; i = i + 8)
                for (y = 0; y < 32; y++) {
                        for (x = 0; x < 8; x++) {
                                SendCommand(0x36); //扩充指令,开绘图显示
                                SendCommand(0x80 + y); //行地址
                                SendCommand(0x80 + x + i); //列地址
                                SendData(*pic++); //写数据 D15-D8
                                SendData(*pic++); //写数据 D7-D0
                                SendCommand(0x30);
                        }
                }
}

使用特权

评论回复
11
wangjiahao88|  楼主 | 2018-3-7 11:08 | 只看该作者
//
/*****************************************
** 将一个整型数据转化为字符串
** 入口参数 要转换的整型数: dataint, 数组p[10]
** 改变思路:整数 -->字符串-->加字符串结束标志
** 可以转换小于0的整数
*****************************************/
void long_to_string(long int dataint, char *p) {
        long int datainttmp;
        char *p1; //指向转换成为数组时用到
        char datachar1[10];
        char datachar2[10];
        uint8_t n = 0; //取整型数据的位数
        uint8_t i = 0;
        uint8_t k1 = 0; //取字符个数
        uint8_t k2 = 0; //取字符个数

        if (dataint >= 0)
                datainttmp = (long int) dataint;
        else
                datainttmp = (long int) dataint * (-1);

        p1 = datachar2;

        while (datainttmp != 0) {
                datachar1[n++] = (datainttmp % 10) + 0x30; //转换为字符并取得这个整型数据的位数 n
                datainttmp /= 10;
        }

        if (dataint > 0) //如果要转换的整型数据>0
        {
                k1 = n - 1;
                k2 = n;

                for (i = 0; i < k2; i++, k1--) {
                        datachar2[k1] = datachar1[i]; //将数字符串倒过来
                }
                datachar2[n] = '\0'; //字符串结束标志
        }

        else if (dataint < 0) //<0
        {
                k1 = n;
                k2 = n + 1;

                for (i = 0; i < k2; i++, k1--) {
                        datachar2[k1] = datachar1[i];
                }
                datachar2[n + 1] = '\0';
                datachar2[0] = '-'; //加上负号
        }

        else if (dataint == 0) //=0
        {
                datachar2[0] = 0x30;
                datachar2[1] = '\0';
        }

        p1 = datachar2;

        strcpy(p, p1);
}

使用特权

评论回复
12
wangjiahao88|  楼主 | 2018-3-7 11:08 | 只看该作者
/*****************************************
** 将一个浮点型数据转化为字符串
** 入口参数 要转换的浮点数: dataf, 数组datastr[10], 小数位数 P
** 最好小数位数不是
** 改变思路:浮点数 --> 整数 -->字符串-->根据各种类型的浮点数不同调整字符位置
** 可以转换小于0的浮点数
*****************************************/
void float_2_string(float dataf, char *datastr, uint8_t p) {
        float dataftmp = dataf;
        char datastr1[10];
        uint8_t flag1 = 0;
        uint8_t flag2 = 0;
        uint8_t k;
        uint8_t i = 0;

        if ((long int) dataf == 0) // dataf为 -1 --- 1 之间的数
        {
                dataftmp += 9; //随便一个整数 只是为了扩大为首位不为0的数
                flag1 = 1;
                if (dataf < 0) {
                        flag2 = 1;
                        dataftmp -= 9; //随便一个整数 只是为了扩大为首位不为0的数
                        flag1 = 0;
                }
        }

        for (i = 0; i < p + 1; i++)
                dataftmp = dataftmp * 10;

        long_to_string((long int) dataftmp, datastr1);
        k = strlen(datastr1);

        for (i = 1; i < p + 1; i++)
                *(datastr1 + (k - i)) = *(datastr1 + (k - i - 1));

        *(datastr1 + (k - i)) = '.';

        if (flag1) //如果为0.00820之类的数
        {
                *datastr1 = '0';
                flag1 = 0;
        }

        if (flag2) //如果为-0.00820之类的数
        {
                *datastr1 = '-';
                *(datastr1 + 1) = '0';
        }

        if (p == 0) {
                *(datastr1 + (k - i)) = '\0';
        }

        strcpy(datastr, datastr1);
}

使用特权

评论回复
13
wangjiahao88|  楼主 | 2018-3-7 11:09 | 只看该作者
//写中文汉字串
void DispString(uint8_t x, uint8_t y, char *string) {
switch (x) {
        case 0:
                SendCommand(0x80 + y);
                break;
        case 1:
                SendCommand(0x90 + y);
                break;
        case 2:
                SendCommand(0x88 + y);
                break;
        case 3:
                SendCommand(0x98 + y);
                break;
        default:
                break;
}
        while (*string) {
                SendData(*string);
                string++;
        }
}

使用特权

评论回复
14
wangjiahao88|  楼主 | 2018-3-7 11:09 | 只看该作者
//
void DispLongint(uint8_t x, uint8_t y, long int datalongint) {
        char a[10];
        long_to_string(datalongint, a);
        DispString(x, y, a);
}

使用特权

评论回复
15
wangjiahao88|  楼主 | 2018-3-7 11:09 | 只看该作者
//写浮点型数据
void DispFloat(uint8_t x, uint8_t y, float dataf, uint8_t p) {
        char a[10];
        float_2_string(dataf, a, p);
        DispString(x, y, a);
        SendData(0x20);
        SendData(0x20);
}

使用特权

评论回复
16
wangjiahao88|  楼主 | 2018-3-7 11:11 | 只看该作者
NUC120 的IIC 组件部分如下:

使用特权

评论回复
17
wangjiahao88|  楼主 | 2018-3-7 11:12 | 只看该作者
/********************************************************************************************************//**
* Define Version number
************************************************************************************************************/
#define DRVI2C_MAJOR_NUM        1
#define DRVI2C_MINOR_NUM        00
#define DRVI2C_BUILD_NUM        1

/********************************************************************************************************//**
* Version define with SysInfra
************************************************************************************************************/
#define DRVI2C_VERSION_NUM     _SYSINFRA_VERSION(DRVI2C_MAJOR_NUM, DRVI2C_MINOR_NUM, DRVI2C_BUILD_NUM)
                                                          
/********************************************************************************************************//**
* Define Error Code
************************************************************************************************************/
// E_DRVI2C_ERR_ARGUMENT                  Wrong Argument
#define E_DRVI2C_ERR_ARGUMENT   _SYSINFRA_ERRCODE(TRUE, MODULE_ID_DRVI2C, 1)

/********************************************************************************************************//**
*  I2C port
************************************************************************************************************/
typedef enum {I2C_PORT0 = 0, I2C_PORT1 = 1} E_I2C_PORT;

typedef void (*I2C_CALLBACK)(uint32_t status);

/********************************************************************************************************//**
* Define I2C Call back function type                                                                      
************************************************************************************************************/
typedef enum
{
        I2CFUNC   = 0,
        ARBITLOSS = 1,
        BUSERROR  = 2,
        TIMEOUT          = 3
} E_I2C_CALLBACK_TYPE;

使用特权

评论回复
18
wangjiahao88|  楼主 | 2018-3-7 11:12 | 只看该作者
/********************************************************************************************************//**
* Define I2C Call back function Data Struct                                                         
************************************************************************************************************/
typedef struct
{
    I2C_CALLBACK        I2CCallBackFn;
    I2C_CALLBACK        ArbitLossCallBackFn;   
    I2C_CALLBACK        BusErrCallBackFn;
    I2C_CALLBACK        TimeoutCallBackFn;

} I2C_CALLBACK_T;

使用特权

评论回复
19
wangjiahao88|  楼主 | 2018-3-7 11:13 | 只看该作者
/********************************************************************************************************//**
* Define I2C functions prototype                                                                          
************************************************************************************************************/
void     DrvI2C_Ctrl(E_I2C_PORT port, uint8_t start, uint8_t stop, uint8_t intFlag, uint8_t ack);
void     DrvI2C_ClearIntFlag(E_I2C_PORT port);
void     DrvI2C_ClearTimeoutFlag(E_I2C_PORT port);
void     DrvI2C_WriteData(E_I2C_PORT port, uint8_t u8data);
uint8_t  DrvI2C_ReadData(E_I2C_PORT port);
uint8_t  DrvI2C_GetIntFlag(E_I2C_PORT port);
int32_t  DrvI2C_Open(E_I2C_PORT port, uint32_t clock_Hz, uint32_t baudrate_Hz);
int32_t  DrvI2C_Close(E_I2C_PORT port);
int32_t  DrvI2C_EnableInt(E_I2C_PORT port);
int32_t  DrvI2C_DisableInt(E_I2C_PORT port);
int32_t  DrvI2C_EnableTimeoutCount(E_I2C_PORT port, int32_t i32enable, uint8_t u8div4);
int32_t  DrvI2C_InstallCallback(E_I2C_PORT port, E_I2C_CALLBACK_TYPE Type, I2C_CALLBACK callbackfn);
int32_t  DrvI2C_UninstallCallBack(E_I2C_PORT port, E_I2C_CALLBACK_TYPE Type);
int32_t  DrvI2C_SetAddress(E_I2C_PORT port, uint8_t slaveNo, uint8_t slave_addr, uint8_t GC_Flag);
int32_t  DrvI2C_SetAddressMask(E_I2C_PORT port, uint8_t slaveNo, uint8_t slaveAddrMask);
int32_t  DrvI2C_SetClock(E_I2C_PORT port, uint32_t clock_Hz, uint32_t baudrate_Hz);
uint32_t DrvI2C_GetClock(E_I2C_PORT port, uint32_t u32clock);
uint32_t DrvI2C_GetStatus(E_I2C_PORT port);

使用特权

评论回复
20
wangjiahao88|  楼主 | 2018-3-7 11:15 | 只看该作者
/********************************************************************************************************//**
* @file    : DrvUART.c
* @brief   : Contains all functions support for UART
* @version : 1.1.3
* @author  : Nuvoton
* @history :
*           <author>      <time>     <version>      <desc>
*           CooCox      2010.10.18    1.1.3     Modify the problem cause by volatile bit-field in the GCC according
*                                               to http://www.codesourcery.com/archives/arm-gnu/msg03675.html
*
*           Nuvoton      2010         1.1.2     Initial version
************************************************************************************************************
* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved
************************************************************************************************************/
//#include <stdio.h>
#include "NUC1xx.h"

/********************************************************************************************************//**
* Includes of local headers                                                                                
************************************************************************************************************/
#include "DrvUART.h"
#include "DrvSYS.h"


/********************************************************************************************************//**
* Macro, type and constant definitions                                                                    
************************************************************************************************************/


/********************************************************************************************************//**
* Global variables                                                                                       
************************************************************************************************************/
static PFN_DRVUART_CALLBACK *g_pfnUART0callback = NULL;
static PFN_DRVUART_CALLBACK *g_pfnUART1callback = NULL;
static PFN_DRVUART_CALLBACK *g_pfnUART2callback = NULL;



/********************************************************************************************************//**
* Interrupt Handler                                                                                       
************************************************************************************************************/
void UART02_IRQHandler(void)
{
    uint32_t u32uart0IntStatus,u32uart2IntStatus;

    u32uart0IntStatus = inpw(&UART0->ISR) ;
   
    u32uart2IntStatus = inpw(&UART2->ISR) ;
   
    if(g_pfnUART0callback != NULL)
    {
        g_pfnUART0callback(u32uart0IntStatus);
    }
    if(g_pfnUART2callback != NULL)
    {
        g_pfnUART2callback(u32uart2IntStatus);
    }
}


void UART1_IRQHandler(void)
{
    uint32_t u32IntStatus;

    u32IntStatus = inpw(&UART1->ISR) ;

    if(g_pfnUART1callback != NULL)
    {
       g_pfnUART1callback(u32IntStatus);
    }

}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

473

主题

7517

帖子

30

粉丝