电能质量芯片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 

QQ截图20171117161233.jpg

另外使用Linux的spisend()函数接口时,一起发送字节长度。

  spi_exchange(&spi, cDataBufferR,cDataBufferW, cDataLength);

总之时序要把握好。



sitemap