电能质量芯片ade7880在arm linux上的驱动移植
电能质量芯片ade7880在arm linux上的驱动移植
本说明是基于imx6ul的Linux操作系统。由于官方没有给出ade7880的Linux驱动,所以使用spidev总线的方式操作ade7880.
在测试之前请确认ade7880的硬件已经OK,并且在 /dev 的目录下有spidevx.0 和gpio。
使用spi的四线制 也就是cs片选线有spi自己通过硬件转换,而不是软件程序控制,这种方式经过测试发现存在问题。片选的时序问题造成读取的数据一直
是0xff,所以cs片选使用软件控制,也就是当成一个gpio 来控制高低电平的输出转换。
spi初始化之前 先要给ade7880 3次高低电平的转换,来确定使用spi通信 ,代码如下
int no,state;
unsigned long val;
gpio = open("/dev/gpio",O_RDWR);
if(gpio < 0){
perror("open");
exit(1);
}
sleep(1);
gpio_set_value(gpio,16,1);
usleep(500000);
gpio_set_value(gpio,16,0);
usleep(500000);
gpio_set_value(gpio,16,1);
usleep(500000);
gpio_set_value(gpio,16,0);
usleep(500000);
gpio_set_value(gpio,16,1);
usleep(500000);
gpio_set_value(gpio,16,0);
usleep(500000);
gpio_set_value(gpio,16,1);
usleep(500000);
gpio_set_value(gpio,16,0);
usleep(500000);
gpio_set_value(gpio,16,1);
usleep(500000);
然后初始化spi
int retv = spi_init(&spi,
SPI_DEVICE, // filename like "/dev/spidev0.0"
gmode, // SPI_* (look "linux/spi/spidev.h")
bitsword, // bits per word (usually 8)
gspeed); // max speed [Hz]
几个参数如下
unsigned long gspeed = 600000;
unsigned int bitsword =8;
unsigned int gmode = SPI_MODE_3;
经过测试波特率在500-600K比较合适。
然后读取ade7880的0xE618 来确认是ade7878 还是ade7880
或者可以继续读取 校验和 寄存器 0xE51F
手册上给的值是 0xAFFA63B9
我们只读msb 的两个字节应该是0xaffa
见下图 45050转换成16进制正是 affa
另外使用Linux的spisend()函数接口时,一起发送字节长度。
spi_exchange(&spi, cDataBufferR,cDataBufferW, cDataLength);
总之时序要把握好。