int InitSock(char* SevIP,int SevPort);
说明:建立socket连接。
参数说明:
char* SevIP---server端ip地址。
int SevPort---server端端口号。
int DeinitSock();
说明:卸载socket连接。
注意:一定要和InitSock成对出现,否则可能会影响别的操作。
int openi2c();
说明:打开i2c。
int closei2c();
说明:关闭i2c。
seti2cspeed(int i2cPort, int i2cSpeed);
说明:设置i2c端口和速率。
参数说明:
int i2cPort--- i2c端口。
int i2cSpeed--- i2c速率。
返回值:0:成功;非0:错误码。
int ReadregMulti(int i2cport, char idevaddr, int iregaddr, int iregaddrcount, char *buffer, int len);
说明:读取寄存器。
参数说明:
int i2cport --- i2c端口号。
char idevaddr--- 设备地址。
int iregaddr--- 寄存器地址。
int iregaddrcount--- 寄存器地址占用字节数。
char *buffer--- 要读的值存放的起始地址。
int len--- 读取寄存器个数。
WriteregMulti(int i2cport, char idevaddr, int iregaddr, int iregaddrcount, char *data, int len);
说明:写寄存器
参数说明:
int i2cport --- i2c端口号。
char idevaddr--- 设备地址。
int iregaddr--- 寄存器地址。
int iregaddrcount--- 寄存器地址占用字节数。
char *data--- 要写的值存放的起始地址。
int len--- 写寄存器个数。
int ReadregPeriod(int i2cport, char idevaddr, int iregaddr, int iregaddrcount, char *buffer, int iregbytes, int count, int period)
说明:周期读某一寄存器。
参数说明:
int i2cport --- i2c端口号。
char idevaddr--- 设备地址。
int iregaddr--- 寄存器地址。
int iregaddrcount--- 寄存器地址占用字节数。
char *buffer--- 要读的值存放的起始地址。
int iregbytes --- 寄存器占字节数。
int count --- 读取次数。
int period --- 读取周期,单位μs。
注:在调用 ReadregPeriod 函数时,count*period<4000000, 这是由于socket读超时时间设置为4s,超过这个数dll会返回-7,读错误,错误码10060。
USBIO_OpenDevice(int deviceId)
说明:打开USB设备。
参数说明:
int deviceId ---设备序列号,0对应第一个设备。
返回值:返回句柄,出错则无效。
USBIO_CloseDevice(int deviceId)
说明:关闭USB设备。
参数说明:
int deviceId ---设备序列号,0对应第一个设备。
USBIO_SetStream(int deviceId, int mode)
说明:设置串口流模式。
参数说明:
int deviceId ---设备序列号,0对应第一个设备。
int mode --- 指定模式,见下行
位1-位0:I2C接口速度/SCL频率,00=低速/20KHz,01=标准/100KHz(默认值),10=快速/400KHz,11=高速/750KHz
位2: SPI的I/O数/IO引脚, 0=单入单出(D3时钟/D5出/D7入)(默认值),1=双入双出(D3时钟/D5出D4出/D7入D6入)
位7: SPI字节中的位顺序, 0=低位在前, 1=高位在前。
其它保留,必须为0。
USBIO_StreamI2C(int deviceId, int writeLength, char * writeBuffer, int readLength, char * readBuffer)
说明:处理I2C数据流,2线接口,时钟线为SCL引脚,数据线为SDA引脚(准双向I/O),速度约56K字节。
参数说明:
int deviceId ---设备序列号,0对应第一个设备。
int writeLength --- 准备写出的数据字节数。
char * writeBuffer --- 指向一个缓冲区,放置准备写出的数据,首字节通常是I2C设备地址及读写方向位。
int readLength --- 准备读取的数据字节数。
char * readBuffer --- 指向一个缓冲区,返回后是读入的数据。
编写控件绑定C脚本函数时,绑定函数的打印格式要求如下:
if(执行正常)
printf("error=%s,return=%f","ok",0.0);
elseif(xxx)
printf("error=%s,return=%d","err 1, failed", 1);
elseif(yyy)
printf("error=%s,return=%d","err 2, failed", 2);
说明:
编写控件绑定C脚本函数时,也应特别注意每个控件的函数返回值要求:
当频谱图从函数读入画图时, C脚本中定义的函数返回值应是:
格式为:{x1,y1}#{x2,y2}#{x3,y3}# .....例如:{3,4}#{5,6}#{7,8}#。
参考样例如下:
#include "stdio.h"
#define length 300
int fftdata(int argc, char ** argv )
{
int doubleArray[2][length];
int i;
int j;
for(i = 0; i < length; i++){
doubleArray[0][i] = i;
doubleArray[1][i] = i + 1;
}
printf("\n");
注意:"error=%s,return="应处于for循环外面。
printf("error=%s,return=","ok");
for(j = 0; j < (length- 1); j++){
printf("{%d,%d}#",doubleArray[0][j],doubleArray[1][j]);
}
return 0;
}
实现原理:C函数脚本调用C编写的dll动态库建立通信,进行I2C读写
如果HiChannel菜单项中DUT网络、I2C速率设置正确,在执行函数脚本的时候,会向C脚本函数默认传递七个参数:
第一个参数:板端IP地址; 比如:192.168.0.1
第二个参数:serverport(固定为4000);
第三个参数:I2cPort 十进制整型 ,比如3;
第四个参数:I2c速率(传递时不会把单位一起传递,例如速率设置了100K,传递时只会传递100)
第五个参数:DevAddress(传递时会把页面中十六进制DevAddress转换为十进制后传递, 例如Dev Address设置了b6,传递时把b6转换为十进制182传递)
第六个参数:函数方法名
第七个参数:标识连接模式(-1表示USB,0表示Socket)。
int functionName( int argc, char ** argv )
argc表示参数个数,argv存储的是所有的参数值
在C脚本中要调用I2C读写的时候可以按索引将参数取出,参数索引从1开始,所以:
argv[1] ==>板端IP(字符串类型)
argv[2]==>serverport(整型)
argv[3]==>I2cport(整型)
argv[4]==> I2c速率(整型)
argv[5]==>DevAddress(整型)
argv[6]==>(Param1)如果Button配置了n个参数,可以按序取出。
argv[7]==>(Param2)如果Button配置了n个参数,可以按序取出。
.
.
argv[n]==>(Param n)如果Button配置了n个参数,可以按序取出。
argv[n+1]==>需要调用的方法名,不带#号,取argv[argc-2]就可以取到方法名。
argv[n+2]==>连接模式,取argv[argc-1]就可以取到连接模式。
如果HiChannel菜单项中USB配置正确,在执行函数脚本的时候,会向C脚本函数默认传递四个参数:
第一个参数:USB速率
第二个参数:DevAddress
第三个参数:函数方法名
第四个参数:标识连接模式(-1表示USB,0表示Socket)。
int functionName( int argc, char ** argv )
argc表示参数个数,argv存储的是所有的参数值
在C脚本中要调用I2C读写的时候可以按索引将参数取出,参数索引从1开始,所以:
argv[1] ==>USB速率 (整型)
argv[2] ==>DevAddress(整型)
argv[3]==>(Param1)如果Button配置了n个参数,可以按序取出。
argv[4]==>(Param2)如果Button配置了n个参数,可以按序取出。
.
.
argv[n]==>(Param)如果Button配置了n个参数,可以按序取出。
argv[n+1]==>需要调用的方法名,不带#号,取argv[argc-2]就可以取到方法名。
argv[n+2]==>连接状态,取argv[argc-1]就可以取到连接模式。
注意:所有的参数在传递到C脚本时都会是字符串类型,所以在使用参数的时候,对于不同的参数要根据它们的类型进行类型转换,否则,会导致程序加载超时,程序无响应。
注意:样例只作为编写C函数格式参考,并不能直接使用
当需要进行I2C读写时,首先需要自定义一个头文件来定义调用方法,头文件参考定义样例如下:
#define CHIP_PORT atoi(argv[3]) //在DUT网络连接时,argv[3]定义了I2C port
#define CHIP_ADDR atoi(argv[5])//在DUT网络连接时,argv[5]定义了设备地址
#define USB_ADDR atoi(argv[2]) //在USB连接模式时,argv[2]定义了USB的设备地址
#define USB_SPEED atoi(argv[1]) //在USB连接模式时,argv[1]定义了USB的速率
//g_connect标识是Sockect连接还是USB连接,g_connect 等于0时,为USB连接,g_connect非0时,为Sockect连接
#define INIT_CONNECT if (g_connect) {\
InitSock(argv[1],atoi(argv[2])); \
}else{\
if(USBIO_OpenDevice(0) == INVALID_HANDLE_VALUE ){ \
printf("error=%s,return=%d","err openerror,failed",-1); \
return; \
} \
USBIO_SetStream(0,USB_SPEED);\
}
#define DEINIT_CONNECT if (g_connect) {\
DeinitSock();\
}else{\
USBIO_CloseDevice(0);\
}
#define CHIP_MRD(REG_ADDR, P_RBUF, RLEN) if (g_connect) { ReadregMulti((CHIP_PORT), (CHIP_ADDR), (REG_ADDR), 1, ((char *)(P_RBUF)), (RLEN)); \
} else {\
unsigned char P_WBUF[2];\
P_WBUF[0] = USB_ADDR;\
P_WBUF[1] = REG_ADDR;\
USBIO_StreamI2C(0,2,(PVOID)pSend,RLEN,(PVOID)(P_RBUF));\
}
#define CHIP_MWR(REG_ADDR, P_WBUF, WLEN) if (g_connect) { WriteregMulti((CHIP_PORT), (CHIP_ADDR), (REG_ADDR), 1, ((char *)(P_WBUF)), (WLEN));\
} else {\
unsigned char P_RBUF;\
char *p = (char *)malloc((WLEN)+2);\
char *pw =(char *)(P_WBUF);\
int i = 0;\
p[0]= USB_ADDR;\
p[1]= REG_ADDR;\
for (i=0;i<(WLEN);i++) {\
p[i+2] = pw[i];\
};\
USBIO_StreamI2C(0,2+(WLEN),(PVOID)p,0,(PVOID)(&cRecv));\
}
定义了头文件后,在编写C脚本开头需要引入它,C函数定义的样例如下:
#include "stdio.h"
#include "string.h"
#include 自定义的头文件
#include "USBIOX.H" //必须要引入
extern int g_connect; //这行代码是必须的
int on_line(int argc, char ** argv)
{
INIT_CONNECT;
unsigned char chip_id[4];
unsigned char on_line;
CHIP_MRD(0x6f, &chip_id, 4);
on_line = (chip_id[2]==0x36) && (chip_id[3]==0x31);
if(on_line) {
printf("error=%s,return=%d","ok",1); }
else {
printf("error=%s,return=%d","ok",0); }
DEINIT_CONNECT;
}
//内部私有方法,使用‘static’来标识
static int demo_m2( int argc, char ** argv )
{
int i = 0;
printf("demo_m2........");
return 0;
}
//只是用来被外部调用,而不在工具UI函数列表中显示,此时使用‘inner_’来标识
int inner_compile( int argc, char ** argv )
{
int i = 0;
printf("I'm inner function");
return 0;
}