adrv9026 spi 接口验证代码
#include <sys/ioctl.h>#include <unistd.h>#include <linux/spi/spidev.h>#include <stdio.h>#include <string.h>#include <stdint.h>#include <errno.h>#include <s
·
#include <sys/ioctl.h>
#include <unistd.h>
#include <linux/spi/spidev.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
#include <stdlib.h>
#include <fcntl.h>
#define SPI_DEV "/dev/spidev1.0"
#define ADRV9025_SPI_BYTES 0x3 /* Number of bytes required to use non HW_RMW */
#define ADRV9025_SPI_WRITE_POLARITY 0x00
#define ADI_ADRV9025_NUMBER_SPI_RETRY 2
int32_t spi_fd;
void init_spi(void){
spi_fd = open(SPI_DEV,O_RDWR);
if(spi_fd < 0){
perror("error:");
return;
}
uint8_t spiMode = 0;
uint32_t speed = 25000000;
uint32_t bitsPerWord = 8;
int ret = ioctl(spi_fd,SPI_IOC_WR_MODE,&spiMode);
if(ret < 0){
perror("error");
return;
}
ret = ioctl(spi_fd,SPI_IOC_WR_BITS_PER_WORD,&bitsPerWord);
if(ret < 0){
perror("error");
return;
}
ret = ioctl(spi_fd,SPI_IOC_WR_MAX_SPEED_HZ,&speed);
if(ret < 0){
perror("error");
return;
}
}
int32_t spi_write(const uint8_t txdata[],uint32_t nums){
return write(spi_fd,txdata,nums);
}
int32_t spi_read(const uint8_t tx[],uint8_t rx[],uint32_t nums){
struct spi_ioc_transfer tr = {0};
tr.tx_buf = (uintptr_t)&tx[0];
tr.rx_buf = (uintptr_t)&rx[0];
tr.len = nums;
tr.delay_usecs = 0;
return ioctl(spi_fd,SPI_IOC_MESSAGE(1),&tr);
}
int32_t adrv9025_spi_data_pack(uint8_t* wrData,uint16_t* nums,uint16_t addr,uint8_t data,uint8_t flag){
wrData[(*nums)++] = (uint8_t)(((flag & 0x01) << 7) | ((addr >> 8) & 0x7F));
wrData[(*nums)++] = (uint8_t)(addr);
wrData[(*nums)++] = (uint8_t)data;
}
int32_t adrv9025_spi_read(uint16_t addr,uint8_t* data){
uint16_t nums;
uint8_t wrData[ADRV9025_SPI_BYTES] = {0};
uint8_t regVal = 0;
uint8_t regData[ADRV9025_SPI_BYTES] = {0};
adrv9025_spi_data_pack(&wrData[0],&nums,addr,regVal,~ADRV9025_SPI_WRITE_POLARITY);
for (i = 0; i < ADI_ADRV9025_NUMBER_SPI_RETRY; i++)
{
ret = spi_read(&wrData[0],®Data[0],nums);
if(ret == 0){
break;
}
}
*data = regData[2];
printf("******************* ADRV9025 READ ****************\n");
printf("Read adrv9025 spi(0x%04X,0x%4X)\n",*data);
printf("Read regData[0] %x regData[1] %x\n",regData[0],regData[1]);
return 0;
}
int main(int argc,char **argv){
uint8_t data;
uint16_t regs[] = {0x0C,0x0D};
int i = 0;
for( i = 0 ; i < sizeof(regs)/sizeof(regs[0]) ; i++){
adrv9025_spi_read(regs[i],&data);
}
return 0;
}
更多推荐
所有评论(0)