纬图虚拟仪器论坛

 找回密码
 立即注册
搜索
查看: 75974|回复: 11

Ginkgo系列Demo code使用注意事项

[复制链接]
发表于 2021-12-13 12:06:36 | 显示全部楼层 |阅读模式
Ginkgo系列Demo code使用注意事项

如果同时使用两个适配器,为了控制不混乱,可以采取如下方式:每一个适配器都有一个唯一的序列号,可以调用接口函数VXI_ReadBoardInfo来查询到,
获取每一个序列号后,可以做一个表,一个序列号对应一个设备索引,这样控制就不会混乱。

混乱的原因:PC在枚举USB设备时,返回的索引会变化(当然,一个设备永远返回0).

附上一个例程:
http://www.viewtool.com/demo/Gin ... d_Serial_Number.zip







回复

使用道具 举报

 楼主| 发表于 2021-12-13 14:22:21 | 显示全部楼层
2. 使用LabView的代码时,注意:
-> Labview的版本位数(是32位还是64位)。
-> 加载Ginkgo_Driver.DLL时,路径不要有中文,空格之类的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-24 15:16:17 | 显示全部楼层
3. 在正常操作过程中,比如读写,有时候会失败,这时候可以按照以下流程进行:
3.1 重新初始化一遍。
3.2 重复失败操作一遍。
3.3 可以计数重新操作的次数,超过几次就软件报错,不要无限制操作下去。

      也可以根据的不同
操作结果,层层“上报”,不必一下就return,最终决定权交由“上级”去处理
        便于好看,可以把这种操作简单封装一下。
比如:
      I2C写失败,可以重新初始化一下设备(可以扫描设备,如果没有设备,就上报错误代码-errorNoDevice),
      再重写,同时计数一次,连续记录3次失败的话,可以返回一个错误代码 - errorTimeout,交由上层处理;
      如果重新操作成功,则返回一个代码 - errorNone。
      上层通过错误代码作相应处理。
      把这种 I2C write,封装成 enumErrorType userVII_Write(...);

小结:     这就是软件的异常处理部分





回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-11 09:59:34 | 显示全部楼层
使用CAN适配器接收数据时,前提条件:
1. scan device
2. open device
3. Init filters。
4. start can channel(如果是CAN mini或者Ginkgo III, 只需初始化一个通道)
按照例程,更改相关的宏定义。

方式有两种:
1. 查询模式,偶尔会丢失数据。
2. 回调模式,设置好回调函数,在回调函数里取数就好。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-22 10:35:52 | 显示全部楼层
使用android demo
1. 如何选择CAN 通讯通道? androidCan2chanels.png
如上图,0 - channel 1; 1 - channel 2

回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-9 09:34:16 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-26 16:43:15 | 显示全部楼层
使用树莓派的的demo时:
1. 使用GCC make 代码之后,会发现找不到libusb-0.1.so.4.
    就在当前的目录里面把libusb.so拷贝一个文件libusb-0.1.so.4即可.
2. 使用python demo时,
    无法找到libusb-0.1.so.4, 则需要在laod libGinkgo_Driver.so之前,加载CDLL("libusb-0.1.so.4", RTLD_GLOBAL).


回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-24 09:58:19 | 显示全部楼层
使用I2C demo code 或者Ginkgo USB-I2c extend APP时请注意:
比如:一次写入8个字节。

1. 子地址要以8的倍数(16进制模式),这样便于理解和操作。

2. 如果不是以8的倍数为子地址subAddress(比如为8A + b ( A, b都为整数,且b小于8))的话,固件会以(8A+b)为索引, 开始写入,超过地址8A+8的数据会写回到以8A为起始地址写入。

3. 我分别以子地址0x01, 0x16,0x20, 写入0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08截图:
i2c-subaddress.png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-29 15:23:38 | 显示全部楼层
Ginkgo 产品的复用功能:
总的原则:
    只要硬件分配不冲突,配置好后,软件就可以“同时“(肯定不是严格意义上的同时执行)运行.    如果实在错不开(硬件分配冲突),就在使用的时候,初始化共享的硬件资源,用完后交出资源控制权。

    具体操作就是:
    1. Scan device(),只要一次。
    2. Open device(),只要一次。
    3. InitFunction1, InitFunction2, InitFunction3...
    4. do Fuction1 , do Fuction2 , do Fuction3 .......

    比如, 既想使用I2C的功能,又想使用GPIO功能:   

// I2C control:
    // Scan device            ret = VII_ScanDevice(1);
    if(ret <= 0){
       printf("No device connect!\n");
       return ret;
    }

    //Open device
    ret = VII_OpenDevice(VII_USBI2C, DEVICE_INDEX, VT_RESERVED);
    if (ret != ERR_SUCCESS){
       printf("Open device error!\n");
       return ret;
    }

    //Initializes the device
    I2C_Config.AddrType = VII_ADDR_7BIT;    // 地址类型是7位地址
    I2C_Config.ClockSpeed = 400000;       // 时钟速度
    I2C_Config.ControlMode = VII_HCTL_MODE;  // 控制模式:硬件控制、软件gpio模拟控制
    I2C_Config.MasterMode = VII_MASTER;    // 可选择:主机模式、从机模式
    I2C_Config.SubAddrWidth = VII_SUB_ADDR_1BYTE; // 子地址的宽度为一个字节,可以理解为访问范围的大小.
    ret = VII_InitI2C(VII_USBI2C, DEVICE_INDEX, I2C_CHANNEL_INDEX, &I2C_Config);

     // I2C write
    ret = VII_WriteBytes(VII_USBI2C, DEVICE_INDEX, I2C_CHANNEL_INDEX, I2C_SLAVE_ADDRESS, subaddr, &write_buffer[0], 8);                        
    if (ret == ERR_SUCCESS){
       printf("Write data OK \n");
    }
    // I2C read
    ret = VII_ReadBytes(VII_USBI2C, DEVICE_INDEX, I2C_CHANNEL_INDEX, I2C_SLAVE_ADDRESS, subaddr, &read_buffer[0], 8);
    if (ret == ERR_SUCCESS){
      printf("Read data ok!\n");               
    }   
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-29 15:24:06 | 显示全部楼层
//   GPIO control =======
     // Set GPIO_7 and GPIO_8 to output
    ret = VGI_SetOutput(VGI_USBGPIO, 0, VGI_GPIO_PIN7 | VGI_GPIO_PIN8);
    if (ret != ERR_SUCCESS) {
       printf("Set pin output error!\n");
       return ret;
    }
    // Set GPIO_7 and GPIO_8
    ret = VGI_SetPins(VGI_USBGPIO, 0, VGI_GPIO_PIN7 | VGI_GPIO_PIN8);
    if (ret != ERR_SUCCESS){
       printf("Set pin high error!\n");
       return ret;
    }
    // Reset GPIO_7 and GPIO_8
    ret = VGI_ResetPins(VGI_USBGPIO, 0, VGI_GPIO_PIN7 | VGI_GPIO_PIN8);
    if (ret != ERR_SUCCESS){
        printf("Set pin low error!\n");
        return ret;
    }
    // Set GPIO_4 and GPIO_5 to input
    ret = VGI_SetInput(VGI_USBGPIO, 0, VGI_GPIO_PIN4 | VGI_GPIO_PIN5);
    if (ret != ERR_SUCCESS){
        printf("Set pin input error!\n");
        return ret;
    }
    // Get GPIO_4 status
    uint16_t pin_value = 0;
    ret = VGI_ReadDatas(VGI_USBGPIO, 0, VGI_GPIO_PIN4, &pin_value);
    if (ret != ERR_SUCCESS){
        printf("Get pin data error!\n");
        return ret;
    } else {
      if ((pin_value & VGI_GPIO_PIN4) != 0){
         printf("GPIO_4 is high-level!\n");
      } else {
         printf("GPIO_4 is low-level!\n");
      }
   }   

   more info, refer to :
   http://www.viewtool.com/wiki/index.php/VGI_InitGPIO
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 15:19:51 | 显示全部楼层
CAN bus 和UART复用截图:Hardware connection:

connection

connection

1. CAN bus adapter send data to UART by UART:

CAN1UARTTx

CAN1UARTTx



2. UART -> CAN bus adapter by UART:


3. CAN interface adapter receive data from CAN Bus adapter:

CAN2Rx5Frames

CAN2Rx5Frames


4. CAN bus adapter receive data from CAN interface adapter:

CAN1Rx5Frames

CAN1Rx5Frames





CAN1UARTRx

CAN1UARTRx
回复 支持 反对

使用道具 举报

发表于 2022-9-20 15:26:53 | 显示全部楼层
在Ginkgo CAN(VTG202A,VTG 203B)和Ginkgo III (VTG300A,VTG 301A)时
要注意波特率的设置不一样,因为时钟使用的不一样(Ginkgo - 36M, Ginkgo III - 42MHz).

比如使用 android studio code 是也是同样的原因,需要根据固件的不一样而设置不同的波特率。
回复 支持 反对

使用道具 举报

发表于 2022-9-20 15:34:03 | 显示全部楼层
使用can的流程:
-> scan device (enum usb)
-> open device
-> init device
-> set filter
-> register callback to read data
-> start can (start channel 0 or 1)

-> send data
-> get data in the registered callback .




补充内容 (2022-9-20 15:50):
==========
typedef  const struct {
int BAUD_RATE;
unsigned char   SJW;
unsigned char   BS1;
unsigned char   BS2;
unsigned short  PreScale;
} s_CAN_BaudRate;

/*
Used for Hardware (CLK=36MHz)...
回复 支持 反对

使用道具 举报

发表于 2022-9-20 15:52:40 | 显示全部楼层
补充波特率的表格:
typedef  const struct {
int BAUD_RATE;
unsigned char   SJW;
unsigned char   BS1;
unsigned char   BS2;
unsigned short  PreScale;
} s_CAN_BaudRate;

/*
Used for Hardware (CLK=36MHz):
1. ViewTool Ginkgo USB-CAN Bus Adapter: VTG202A
2. ViewTool Ginkgo USB-CAN Interface: VTG203B
*/

/* BAUD_RATE SJW BS1 BS2 PreScale; */
s_CAN_BaudRate  Ginkgo2CAN_BaudRateInitTab[]= {
{1000,1,2,1,9},     // 1M (1000K)
{900,1,5,2,5},      // 900K
{800,1,10,4,3},     // 800K
{666,1,7,1,6},      // 666K
{600,1,3,1,12},     // 600K
{500,1,4,1,12},     // 500K
{400,1,7,1,10},     // 400K
{300,1,6,1,15},     // 300K
{250,1,6,1,18},     // 250K
{225,1,6,1,20},     // 225K
{200,1,15,2,10},    // 200K
{160,1,12,2,15},    // 160K
{150,1,6,1,30},     // 150K
{144,1,3,1,50},     // 144K
{125,1,6,1,36},     // 125K
{120,1,12,2,20},    // 120K
{100,1,6,1,45},     // 100K
{90,1,6,1,50},      // 90K
{80,1,4,1,75},      // 80K
{75,1,6,1,60},      // 75K
{60,1,6,1,75},      // 60K
{50,1,6,1,90},      // 50K
{40,1,7,1,100},     // 40K
{30,1,6,1,150},     // 30K
{20,1,6,1,225},     // 20K
};

/*
Used for Hardware (CLK=42MHz):
1. ViewTool Ginkgo USB-CAN Bus Adapter: VTG300A
2. ViewTool Ginkgo USB-CAN Interface: VTG301A
*/
s_CAN_BaudRate  Ginkgo3CAN_BaudRateInitTab[]= {     
{1000,1,2,4,6},       // 1M (1000K)
{900,1,16,6,2},       // 900K
{800,1,5,7,4},       // 800K
{666,1,12,8,3},       // 666K
{600,1,5,4,7},       // 600K
{500,1,7,6,6},       // 500K
{400,1,7,7,7},       // 400K
{300,1,8,5,10},      // 300K
{250,1,8,5,12},      // 250K
{225,1,13,3,11},      // 225K
{200,1,5,8,15},      // 200K
{160,1,9,1,24},      // 160K
{150,1,6,3,28},      // 150K
{144,1,7,2,29},      // 144K
{125,1,4,3,42},     // 125K
{120,1,3,3,50},     // 120K
{100,1,6,5,35},      // 100K
{90,1,4,7,39},     // 90K
{80,1,16,4,25},     // 80K
{75,1,8,1,56},      // 75K
{60,1,5,1,100},      // 60K
{50,1,6,1,105},      // 50K
{40,1,7,2,105},      // 40K
{30,1,11,2,100},     // 30K
{20,1,9,2,175},     // 20K
};
回复 支持 反对

使用道具 举报

发表于 2022-9-20 15:54:46 | 显示全部楼层
MarkZ 发表于 2022-9-20 15:34
使用can的流程:
-> scan device (enum usb)
-> open device

请严格按照上述步骤执行.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|纬图虚拟仪器

GMT+8, 2024-12-21 20:23 , Processed in 0.076293 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表