#include #include #include #include #include #include #include #include #include #include #include "../inc/type.h" #include "../inc/i2c_drv.h" #include "../inc/ispi.h" #include "../inc/isys_com.h" #include "adrv9009.h" #define ADRV9009_SPI_NODE "/dev/spidev32766.1" struct ad9009_chip_init ad9009_config = { 0x2, //chip_count { // ad9009_0 { 0x61, //写使能寄存器 write_en_reg 0, //写使能寄存器的控制位 write_en_bit 0x60, //读使能寄存器 read_en_reg 0, //读使能寄存器的控制位 read_en_bit 0x62, //操作寄存器 addr_reg 0x63, //写数据寄存器 write_data_reg 0x98, //读数据寄存器 read_data_reg 0x99, //写数据状态寄存器 write_status_reg 0, //写数据状态寄存器的标志位 write_status_bit 0x99, //读数据状态寄存器 read_status_reg 0, //读数据状态寄存器的标志位 read_status_bit 0x12, //复位寄存器 read_status_bit 0, //复位寄存器的标志位 1, //reset_level 4, //每次发送休眠时间(us) }, // ad9009_1 { 0x65, //写使能寄存器 0, //写使能寄存器的控制位 0x64, //读使能寄存器 0, //读使能寄存器的控制位 0x66, //操作寄存器 0x67, //写数据寄存器 0x9A, //读数据寄存器 0x9B, //写数据状态寄存器 0, //写数据状态寄存器的标志位 0x9B, //读数据状态寄存器 0, //读数据状态寄存器的标志位 0x22, //复位寄存器 0, //复位寄存器的标志位 1, //reset_level 4, //每次发送休眠时间(us) } } }; #if 1 int adrv9009_spi_fd = -1; void spi_9009_init(void) { unsigned char mode = SPI_MODE_3 ; // 1 0 -- 1 闲时高电平, 0第一个边沿采样 unsigned char bits = 8; unsigned int speed = 100000; uint16 u16data = 0; init_spi_dev(ADRV9009_SPI_NODE, &adrv9009_spi_fd, mode, bits, speed); printf("spi init 9009 fd=%d\n", adrv9009_spi_fd); } static s8 spi_write_9009(u16 addr, u8 data) { int ret; //printf("spi_write addr=0x%x data=0x%x\n", addr, data); ret = spi_w_addr16_data8(adrv9009_spi_fd, addr, data); if(ret == 0) { return 0; } else { if(ret == -1) log_printf(LOG_ERR,I_SYS_STATUS,"9009_spi_fd err, < 0 \n"); else if(ret == -2) log_printf(LOG_ERR,I_SYS_STATUS,"can't send spi message, for write 9009_spi_fd\n"); return -1; } } static s8 spi_read_9009(u16 addr, u8 *pdata) { int ret; //printf("spi_read addr=0x%x \n", addr); ret = spi_r_addr16_data8(adrv9009_spi_fd, addr, pdata); if(ret == 0) { return 0; } else { if(ret == -1) log_printf(LOG_ERR,I_SYS_STATUS,"9009_spi_fd err, < 0 \n"); else if(ret == -2) log_printf(LOG_ERR,I_SYS_STATUS,"can't send spi message, for read 9009_spi_fd\n"); return -1; } } int ad9009_write_hw_spi(int num, u32 addr, u32 *pdata, u32 count) { int ret = OK; struct ad9009_init *p; if(num > ad9009_config.chip_count){ printf("ERROR:ad9009_write:chip num(%d) >%d.! \r\n", num, ad9009_config.chip_count); return ERROR; } if(num == 1){ p = (struct ad9009_init *)&ad9009_config.data; } else{ p = &ad9009_config.data[1]; } uint8 *p8data = (uint8 *)pdata; while (count--){ spi_write_9009((uint16)(addr&0xffff), *p8data); addr++; p8data++; } return ret; } int ad9009_read_hw_spi(int num, u32 addr, u32 *pdata, u32 count) { int ret = OK; struct ad9009_init *p; if(num >ad9009_config.chip_count){ printf("ERROR:ad9009_read:chip num(%d) >%d.! \r\n",num,ad9009_config.chip_count); return ERROR; } if(num==1){ p = (struct ad9009_init *)&ad9009_config.data; } else{ p = &ad9009_config.data[1]; } uint8 *p8data = (uint8 *)pdata; while (count--){ if(addr>0xffff){ printf("warning, addr=0x%x over range!\n", addr); } spi_read_9009((uint16)(addr&0xffff), p8data); addr++; p8data++; } return ret; } #if 0 int ad9009_write_sim_spi(int num, u32 addr, u32 *pdata, u32 count) { int ret = OK; struct ad9009_init *p; u32 write_status = 0; u32 timeout_count = 0; u32 write_data; if(num > ad9009_config.chip_count){ printf("ERROR:ad9009_write:chip num(%d) >%d.! \r\n", num, ad9009_config.chip_count); return ERROR; } if(num == 1){ p = (struct ad9009_init *)&ad9009_config.data; } else{ p = &ad9009_config.data[1]; } /*int fd = open(FPGA_ADRV9009_NODE, O_RDWR); if (fd < 0) { printf("\n\n[ ad9009_write_sim_spi ] node err.\n"); return ERROR; }*/ while (count--){ fpga_write_axi0(p->addr_reg, addr, 1); fpga_write_axi0(p->write_data_reg, *pdata, 1); write_data = 0; fpga_write_axi0(p->write_en_reg, write_data, 1); write_data = 1; fpga_write_axi0(p->write_en_reg, write_data, 1); timeout_count = 0; do{ usleep(p->sleep_time); //if(OK != (fpga_getbit(fd, p->write_status_reg, p->write_status_bit, 1, &write_status))) if(OK != (fpga_read_axi0(p->write_status_reg, &write_status, 1))){ ret = ERROR; printf("ERROR:read status reg[0x%x]=0x%x failed! \n", p->write_status_reg, write_status); break; } timeout_count++; write_status = (write_status >> p->write_status_bit); if ((RETRY_GET_STATUS_COUNT_MAX) < timeout_count){ //最多尝试100次 ret = ERROR; printf("[%s,%d]ERROR:read reg[0x%x]=0x%x timeout! \r\n", __FUNCTION__, __LINE__, p->write_status_reg,write_status); break; } }while (write_status != 1); addr++; pdata++; } //close(fd); return ret; } int ad9009_read_sim_spi(int num, u32 addr, u32 *pdata, u32 count) { int ret = OK; struct ad9009_init *p; u32 read_status = 0; u32 timeout_count = 0; u32 write_data; if(num >ad9009_config.chip_count){ printf("ERROR:ad9009_read:chip num(%d) >%d.! \r\n",num,ad9009_config.chip_count); return ERROR; } if(num==1){ p = (struct ad9009_init *)&ad9009_config.data; } else{ p = &ad9009_config.data[1]; } /*int fd = open(FPGA_ADRV9009_NODE, O_RDWR); if (fd < 0) { printf("\n\n[ ad9009_read_sim_spi ] node err.\n"); return ERROR; }*/ while (count--){ fpga_write_axi0(p->addr_reg, addr, 1); write_data = 0; fpga_write_axi0(p->read_en_reg, write_data, 1); write_data = 1; fpga_write_axi0(p->read_en_reg, write_data, 1); timeout_count = 0; do{ usleep(p->sleep_time); //if (OK != fpga_getbit(fd, p->read_status_reg, p->read_status_bit, 1, &read_status)) if (OK != fpga_read_axi0(p->read_status_reg, &read_status, 1)){ ret = ERROR; printf("ERROR:read status reg[0x%x] =0x%xfailed! \r\n", p->read_status_reg, read_status); break; } read_status = (read_status >> p->read_status_bit); timeout_count++; if ((RETRY_GET_STATUS_COUNT_MAX) < timeout_count){ //最多尝试100次 ret = ERROR; printf("[%s,%d]ERROR:read reg[0x%x] timeout! \r\n", __FUNCTION__, __LINE__, p->write_status_reg); break; } }while (read_status != 1); if (1 != read_status){ ret = ERROR; printf("ERROR:time out, read_status = %d\r\n",read_status); break; } if (OK != fpga_read_axi0(p->read_data_reg, pdata, 1)){ printf("[%s%d]ERROR: read reg[0x%x] failed! \r\n", __FUNCTION__, __LINE__, addr); ret = ERROR; break; } addr++; pdata++; } //close(fd); return ret; } #endif int ad9009_reset(int num) { int ret = OK; //分开寄存器控制 struct ad9009_init *p; u32 write_data; if(num >ad9009_config.chip_count){ printf("ERROR:ad9009_reset:chip num(%d) >%d.! \r\n",num,ad9009_config.chip_count); return ERROR; } if(num==1){ p = (struct ad9009_init *)&ad9009_config.data; } else{ p = &ad9009_config.data[1]; } /*int fd = open(FPGA_ADRV9009_NODE, O_RDWR); if (fd < 0) { printf("\n\n[ ad9009_reset ] node err.\n"); return ERROR; }*/ //@cc参照原来的程序 reset adrv9009 0x12 先 1后0 //write_data = (p->reset_level<reset_bit); write_data = p->reset_level; fpga_write_axi0(p->reset_reg, write_data, 1); usleep(100*1000); write_data = !(p->reset_level); fpga_write_axi0(p->reset_reg, write_data, 1); //close(fd); return ret; } #endif