“线程:测试”中讨论的其它部件,
代码:
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <Linux/SPI/spedev.h>
#define 卫生组织_am_I_REG 0x75
#define 卫生组织_am_I_Expected VAL 0x91
#define ACCEL_CONFIG_REG 0x28
#define gyro_config_REG 0x27
#define using _write_FUNC 0
静态 const char *设备="/dev/spidev0.0";
静态 uint8_t 模式= SPI_MODE_1;
静态 uint8_t 位=8;
静态 UINT32_t SPI_speed_Hz = 1000;
静态 int transfer_len =4;
静态 int fd;
/********************************************* //**
*初始化 SPI 功能
(小一 /
Int payload_board_SPI_INIT (空)
{
内部支架=0;
FD =开路(设备,O_RDWR);
如果(FD < 0){
错误(“无法打开设备”);
返回-1;
}
//SPI 模式
//模式= SPI_MODE_1;
RET = ioctl (FD,SPI_IOC_WR_MODE,&MODE);
如果(转台< 0){
perror (“无法设置 SPI 模式”);
返回支架;
}
//每字位数
RET = ioctl (FD,SPI_IOC_WR_Bits_Per 字,&Bits);
如果 (转台< 0)为{
错误("SPI_IOC_MESSAGE");
返回支架;
}
//最大速度 Hz
RET = ioctl (FD,SPI_IOC_WR_MAX_SPEED _Hz,&SPI_SPEED _Hz);
如果(转台< 0){
错误(“无法设置最大速度 Hz”);
返回支架;
}
返回0;
//还有其他 IOCTL 与此无关
//特定从属设备。
}
/********************************************* //**
*从 SPI 从属设备寄存器读取一个字节。
*
*@param reg_addr 是要读取的寄存器的地址。
*@param read_buffer 是指向读取数据字节所在变量的指针
*将被存储。
*
*@成功返回0。否则-1。
(小一 /
静态整数 ICG_20660_REG_READ (uint8_t REG_addr,uint8_t* read_buffer)
{
结构 SPI_IOC_TRANSFER tr;
内部支架;
UINT8_t wr_data[2]={0};
UINT8_t rd_data[2]={0};
memset(&tr, 0, sizeof(tr ));//清除任何无效数据。 这是必需的。
TR.TX_Buf =(无符号长) wr_data;
TR.Rx_buf =(无符号长) rd_data;
tr.len = transfer_len,//一个完整的读/写周期由16位数据传输组成。
//set Bit7 (位7)以告知从属设备我们正在读取数据。
WR_DATA[0]=(REG_ADDR|0x80);
RET = ioctl (FD,SPI_IOC_MESSAGE (1),&tr);
如果(转台< 1){
Perror("[payload IMU] can't send SPI message");
返回-1;
}否则
//我们已经读取了2个字节的数据。 但第一个字节是垃圾。
read_buffer[0]= rd_data[1];
返回0;
}
}
/********************************************* //**
*将一个字节写入 SPI 从属设备寄存器。
*
*@param reg_addr 是要写入的寄存器的地址。
*@param write_data 是要写入的8位数据。
*
*@成功返回0。否则-1。
(小一 /
内部 ICG_20660_REG_WRITE (uint8_t REG_addr,uint8_t write_data)
{
结构 SPI_IOC_TRANSFER tr;
内部支架;
UINT8_t wr_data[4]={0};
UINT8_t rd_data[4]={0};
memset(&tr, 0, sizeof(tr ));//清除任何无效数据。 这是必需的。
TR.TX_Buf =(无符号长) wr_data;
TR.Rx_buf =(无符号长) rd_data;
tr.len = transfer_len,//一个完整周期由16位数据传输组成。
//重置 Bit7以告诉从属设备我们正在写入。
WR 数据[0]= REG_ADDR;
WR_DATA[1]=写入数据;
RET = ioctl (FD,SPI_IOC_MESSAGE (1),&tr);
printf("\n 写入缓冲:%X %X %X \n",wr_data[0],wr_data[1],wr_data[2],wr_data[3]);
printf("读取缓冲区:%X %X %X \n",rd_data[0],rd_data[1],rd_data[2],rd_data[3]);
如果(转台< 1){
perror ("[error][payload IMU]无法发送 SPI 消息");
返回-1;
}否则
返回0;
}
}
/********************************************* //**
*启动有效载荷板 SPI 接口测试。
*
*@param Response_buffer 是指向 TLV 所在缓冲区的指针
*将存储来自测试功能的响应。
*
*@返回接收到的 TLV 字符串的长度
(小一 /
int cmd_pld_imU_SPI_test (char* response 缓冲区)
{
UINT8_t val_read = 0;
内部支架;
char* pass_string =“04000300140000010004PASS \r\n”;
char* ffail_string =“04000300320000010004FIL0000020008buserror\r\n”;
RET = ICG_20660_REG_READ (WH_AM_I_REG,&VAL_READ);
如果(ret<0){
strcpy (Response_buffer,fail_string);
printf("[错误][payload IMU]读取错误\n");
返回 strlen (response 缓冲区);
}
如果(val_read = Wher_am_I_Expected _VAL){
strcpy (Response_buffer,pass_string);
返回 strlen (response 缓冲区);
}否则
strcpy (Response_buffer,fail_string);
printf("[错误][payload IMU]意外的 WAT_AM_I 值:0x%x\n",val_read;
返回 strlen (response 缓冲区);
}
}
Int main (无效)
{
printf("\nStart\n");
内部支架;
RET = payload_board_SPI_INIT();
printf("\nret =%d",ret);
内部 I =10;
当时(i>0)
{
RET = ICG_20660_REG_WRITE (0b11,0xff);
printf("\nret =%d",ret);
睡眠(1);
RET = ICG_20660_REG_WRITE (0b11,0xa5);
printf("\nret =%d",ret);
一;
}
关闭(FD);
}
计时图
问题:
在使用上述代码测试 ADS8668时, 我遇到了一个意外的行为,即写入到0x2寄存器的值在16时钟后没有得到。在这里,我使用的是 SPI 模式1,但数据在16时钟的下缘偏移,而不是前缘17时钟。我想是 出现问题。请帮助我避免意外结果