C++ Can';t使用qt在imx6中发送spi消息

C++ Can';t使用qt在imx6中发送spi消息,c++,qt,spi,imx6,C++,Qt,Spi,Imx6,您好,我正在为imx6飞思卡尔微处理器开发Qt应用程序。我正在使用qtcreator 4.2.1。 我需要使用imx6的SPI模块。首先,我构建了一个3.14内核版本,并根据spidev_测试示例编写了一个程序。我的计划是: 第一个SPI配置: int ret = 0; device = "/dev/spidev0.0"; bits = 8; speed = 4500000; mode = 0; delay = 0; fd = open(device, O_RDWR); if (fd <

您好,我正在为imx6飞思卡尔微处理器开发Qt应用程序。我正在使用qtcreator 4.2.1。 我需要使用imx6的SPI模块。首先,我构建了一个3.14内核版本,并根据spidev_测试示例编写了一个程序。我的计划是:

第一个SPI配置:

int ret = 0;
device = "/dev/spidev0.0";
bits = 8;
speed = 4500000;
mode = 0;
delay = 0;

fd = open(device, O_RDWR);
if (fd < 0){
    pabort("can't open device");
}
else{
    qDebug("Open device");
}

/*
 * spi mode
 */
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
if (ret == -1){
    pabort("can't set spi mode");
}

ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
if (ret == -1){
    pabort("can't get spi mode");
}
/*
 * bits per word
 */
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if (ret == -1){
    pabort("can't set bits per word");
}

ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if (ret == -1){
    pabort("can't get bits per word");
}
/*
 * max speed hz
 */
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (ret == -1){
    pabort("can't set max speed hz");
}
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (ret == -1){
    pabort("can't get max speed hz");
}
qDebug("spi mode: %d\n", mode);
qDebug("bits per word: %d\n", bits);
qDebug("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
int-ret=0;
device=“/dev/spidev0.0”;
位=8;
速度=4500000;
模式=0;
延迟=0;
fd=开路(装置,O_RDWR);
如果(fd<0){
paport(“无法打开设备”);
}
否则{
qDebug(“开放式设备”);
}
/*
*spi模式
*/
ret=ioctl(fd、SPI、IOC、WR、模式和模式);
如果(ret==-1){
pabort(“无法设置spi模式”);
}
ret=ioctl(fd、SPI、IOC、RD模式和模式);
如果(ret==-1){
paport(“无法获取spi模式”);
}
/*
*每字位数
*/
ret=ioctl(fd、SPI、IOC、WR、位/字和位);
如果(ret==-1){
paport(“无法设置每个字的位”);
}
ret=ioctl(fd、SPI、IOC、RD、位/字和位);
如果(ret==-1){
paport(“无法获取每个字的位”);
}
/*
*最大速度hz
*/
ret=ioctl(fd、SPI、IOC、WR、最大速度、HZ和速度);
如果(ret==-1){
pabort(“无法设置最大速度hz”);
}
ret=ioctl(fd、SPI、IOC、RD、最大速度、HZ和速度);
如果(ret==-1){
paport(“无法获得最大速度hz”);
}
qDebug(“spi模式:%d\n”,模式);
qDebug(“每个字的位数:%d\n”,位数);
qDebug(“最大速度:%d Hz(%d KHz)\n”,速度,速度/1000);
然后是传递函数:

void SpiCom::传输(int-fd,无符号字符字){

int-ret;
uint8_t rx[]={0,};
spi_ioc_传输tr;
无符号字符数据[]={word};
tr.tx_buf=(无符号长)数据;
tr.rx_buf=(无符号长)rx;
tr.len=1;
tr.delay_usecs=延迟;
tr.speed_hz=速度;
tr.bits_per_word=位;
ret=ioctl(fd、SPI、IOC消息(1)和tr);
if(ret<1)
paport(“无法发送spi消息”);
dataReaded=(无符号字符)rx[0];
}

对于3.14版本的内核,我的程序运行得很好,但我必须更新到4.9版本的内核,然后我的程序就不能运行了。当我想要传输数据时,总是显示“无法发送spi消息”消息错误。 如果我用gcc编译器编译这部分程序,但当我使用qt编译器并执行应用程序时,它会显示错误消息。 我到处找,但什么也找不到。
如果有人能帮助我。

“它显示消息错误。”确切地说是什么错误?可能是邪恶的
(无符号长)数据
可能是罪魁祸首。它是不可移植的代码<代码>\uu u64是预期的,指针不一定表示为
无符号长
。改用
\u64
uint64\t
。此外,我想编译器可能不会意识到这些缓冲区的内容已经更新,除非您对它们进行voltatile验证。谢谢您的帮助。错误消息是:“无法发送SPI消息:参数无效”。正如你所说,我改了(无符号长)64,但我有同样的错误。当你说我需要资格时,你的确切意思是什么?我知道我需要放(volatile uuu64)对吗?提前非常感谢!这听起来像是一个应用程序输出。只需在行上放置一个断点并检查所有涉及的变量?我可以通过添加memset(&tr,0,sizeof(tr))来解决它;spi_ioc_传输tr后;
int ret;
uint8_t rx[] = {0, };

spi_ioc_transfer tr;
unsigned char data[] = {word};
tr.tx_buf = (unsigned long)data;
tr.rx_buf = (unsigned long)rx;
tr.len = 1;
tr.delay_usecs = delay;
tr.speed_hz = speed;
tr.bits_per_word = bits;

ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
    pabort("can't send spi message");

dataReaded = (unsigned char)rx[0];