主题:[求助]6800 SPI通讯的问题

  共有39074人关注过本帖    
帅哥哟,离线,有人找我吗?
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信号的状态?

图片点击可在新窗口打开查看



  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
hzc
2楼 信息 | 搜索 | 邮箱


加好友 发短信 员工
  发帖心情 Post By:2019-3-18 13:05:00   [只看该作者]

你好,调用一次发送就会有一次片选操作,ESM6800的SPI一次片选能够传输的长度最长为256byte,代码中发送数据是否是合并到一次的ioctl传输操作中呢?只要buf长度小于256byte,就能够在一次片选完成。


  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
ardy
3楼 信息 | 搜索 | 邮箱


加好友 发短信
[求助]6800 SPI通讯的问题  发帖心情 Post By:2019-3-18 13:52:00   [只看该作者]

我在程序中确实是只调用了一次ioctl操作传输数据,buf长度就13个byte。但是事实情况就是变成了13次片选操作。有其它初始化设置会导致这种情况吗?


  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
hzc
4楼 信息 | 搜索 | 邮箱


加好友 发短信 员工
  发帖心情 Post By:2019-3-18 15:06:00   [只看该作者]

你好,那可能是内核没有更新的原因,我们针对这个问题专门做过修改,修改后的spi支持单次传输最多256byte长度,放的话请留一个邮箱,我们会把更新内核发送到邮箱。


  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
ardy
5楼 信息 | 搜索 | 邮箱


加好友 发短信
[求助]6800 SPI通讯的问题  发帖心情 Post By:2019-3-18 15:17:00   [只看该作者]

我的邮箱:83699938@qq.com   谢谢!


  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
hzc
6楼 信息 | 搜索 | 邮箱


加好友 发短信 员工
  发帖心情 Post By:2019-3-18 16:27:00   [只看该作者]

你好,邮件已经发送,请查收。


  单帖管理 | 引用 | 回复 回到顶部

返回首页

[求助]6800 SPI通讯的问题

用户名:
            验证码: 验证码,看不清楚?请点击刷新验证码
内容: