主题:[求助]6800 SPI通讯的问题 共有39101人关注过本帖 |
---|
ardy |
1楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
[求助]6800 SPI通讯的问题 Post By:2019-3-17 12:13:00 [显示全部帖子]
我用6800的核心板通过spi接口与外部芯片通讯,程序基本是光盘里的示例程序,就是改了发送数据的内容,代码如下: static const char *device = "/dev/spidev1.0"; static uint8_t mode = 3; static uint8_t bits = 8; static uint32_t speed = 5000000; static uint16_t delay; uint8_t tx[] = { 0x55, 0x00, 0x84, 0x00,0x08,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00 }; uint8_t rx[ARRAY_SIZE(tx)]; struct spi_ioc_transfer tr[2]; void transfer(int fd) { int ret; int i1; printf( "transfer\n"); tr[0].tx_buf = (unsigned long)tx; tr[0].rx_buf = (unsigned long)rx; tr[0].len = ARRAY_SIZE(tx); tr[0].delay_usecs = delay; tr[0].speed_hz = speed; tr[0].bits_per_word = bits; /*tr[1].tx_buf = NULL; tr[1].rx_buf = (unsigned long)rx; tr[1].len = 1; tr[1].delay_usecs = 0; tr[1].speed_hz = speed; tr[1].bits_per_word = bits;*/ ret = ioctl(fd, SPI_IOC_MESSAGE(1), tr ); if (ret < ARRAY_SIZE(tx) ) pabort("can't send spi message"); printf("ret=%d\n", ret ); for( i1=0; i1<ret; i1++ ) printf("%.2X ", rx[i1] ); printf("\n"); } int main( int argc, char *argv[] ) { char wr_buf[]={ 0x1b,0x55,0x1f,0x0f,0xff,0x00,0x1f,0x0f, 0xff,0x00 }; char rd_buf[10]; int i; int ret = 0; int fd; fd = open(device, O_RDWR); if (fd < 0) pabort("can't 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"); printf("spi mode: %d\n", mode); printf("bits per word: %d\n", bits); printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000); if( argc > 1 ) { if( write(fd, wr_buf, 2) != 2 ) perror("Write Error"); } else transfer( fd ); close(fd); return ret; } 程序运行后的显现是没有收到设备返回的数据, 命令行显示结果是: 用示波器监测CS和MOSI信号波形如下:红色是CS信号,蓝色是MOSI信号,发送的数据是正确的,但是发现CS信号在每发送一个字节后都会变为高电平,而不是在整个报文发送过程中始终保存低电平,可能就是这个问题导致了连接的spi芯片不响应。请问如何设置能够在一帧数据发送的全过程中,CS信号始终保持低电平。 另外我使用的通讯芯片,还要求在开始发送前,CS信号先保持低电平一段时间,如何通过程序手工控制CS信号的状态? |
单帖管理 | 引用 | 回复 |
ardy |
2楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
[求助]6800 SPI通讯的问题 Post By:2019-3-18 13:52:00 [显示全部帖子]
我在程序中确实是只调用了一次ioctl操作传输数据,buf长度就13个byte。但是事实情况就是变成了13次片选操作。有其它初始化设置会导致这种情况吗? |
单帖管理 | 引用 | 回复 |
ardy |
3楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
[求助]6800 SPI通讯的问题 Post By:2019-3-18 15:17:00 [显示全部帖子]
我的邮箱:83699938@qq.com 谢谢! |
单帖管理 | 引用 | 回复 |