linux下spi驱动里的spi_write_then_read函数该怎么使用

linux下spi驱动里的spi_write_then_read函数该怎么使用,第1张

水平不行,不一定对,仅供参考哈。如果只是从AD里读数据的话,用spi_read就可以了,定义一个8位的缓冲区和一个16位的缓冲区。然后把读到的2个8bit的数据组合成1个16bit的数据。每次读到的数据量通过该函数的参数设定。如果是想实现全双工,可以使用spi_write_then_read读是一样的,写的话自己先把16位数据转换成2个8bit的数据,存放在一个8bit的缓冲区,作为该函数的参数。

内核版本2.6.30。编进内核的SPI驱动,通过看代码我明白了,大致过程是这样:

1、先创建一个spi_board_info结构描述spi设备信息,调用spi_register_board_info将这个结构添加到board_list中。

2、然后调用spi_register_master注册SPI控制器驱动,此时会调用scan_boardinfo扫描board_list,根据spi_board_info调用spi_new_device生成spi_device结构,用spi_add_device添加设备。

3、调用spi_register_driver注册spi_driver,通过与device匹配驱动设备。

/*这是一个简单的用户程序与驱动交互的例程*/

void main(void)  

{  

   int testdev 

   int i 

   char buf[10] 

  /* 这里是用的open系统调用,是linux内核接口函数,不是库函数,返回fd,详细请google ,这个open最终会调用驱动中的open函数(代码流程是这样的open()->sys_open()->filp_open()->dentry_open()->驱动open)*/

    testdev = open ("/dev/test",O_RDWR)  

    if(testdev == -1)  

    {  

        printf("Cann't open file...../n")  

        exit(0)  

    }  

    printf("buf = 0x%x/n",buf)  

/* 下面的read write 和ioctl是用户程序和内核驱动的最直接的交互方式 */

    read(testdev,buf,10) 

    write(testdev,buf,1)  

    led_ctl.port='G'  

    led_ctl.bit=5  

    led_ctl.value=0  

    ioctl(testdev,GPIO_IO_SET_GPG,&led_ctl)  

    printf("%s",buf)  

    pause()  

    close(testdev)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8489704.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-17
下一篇 2023-04-17

发表评论

登录后才能评论

评论列表(0条)

保存