Firefly开源社区

标题: 怎么在FireFrame编写spi应用程序 [打印本页]

作者: iot_tech    时间: 2016-1-31 15:36
标题: 怎么在FireFrame编写spi应用程序
想把RK3128的SPI作为master去读取从设备的数据。 我编写了下面一段代码,但是在spi的cs,clk,mosi和miso任何一个引脚上都没有检测到电平变化!

所用的引脚为 ,7,8,9,10四个引脚。
有/dev/spi_misc_test设备存在!
代码如下


int
main(int argc, char **argv) {
    int fd, ret;
    char filename[] = "/dev/spi_misc_test";
    uint32_t SPEED = 0;
    uint8_t bits_per_word = 0, mode = 0, lsb = 0;
    uint8_t command[2] = {0};
    uint8_t recv   [2] = {0};
    spi_pin_mux();
int status;

    fd = open(filename, O_RDWR);
    if (fd < 0) {
        printf("%s open failed!\n", filename);

    }

    //set settings
    SPEED = 400000;
    lsb = 0;
    bits_per_word = DEFAULT_BITS_PER_WORD;//16;
    ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &SPEED);
    ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits_per_word);
    ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
    ret = ioctl(fd, SPI_IOC_WR_LSB_FIRST, &lsb);


        struct spi_ioc_transfer msg;
    memset(&msg, 0, sizeof(msg));

        msg.tx_buf = (unsigned long)txbuf;
    // is it need to set rx_buf ?
        msg.len = len;

        msg.speed_hz = speed_hz;
        msg.delay_usecs = delay_usecs;
        msg.bits_per_word = bits_per_word;
        msg.cs_change = (uint8_t)cs_change;

while(1)
{
    ret = ioctl(fd, SPI_IOC_MESSAGE(1), &msg);
}

}

请问,这段代码在RK3128上不适用么?




[img]file:///C:\Users\tt\AppData\Roaming\Tencent\Users\78477602\QQ\WinTemp\RichOle\AYA2[QEA]K3M}SU(]B`5%NA.png[/img]


作者: madman    时间: 2016-1-31 16:22
那个不是ioctl的接口,具体你可以去看看 drivers/spi/spi-rockchip-test.c
作者: iot_tech    时间: 2016-1-31 16:48
madman 发表于 2016-1-31 16:22
那个不是ioctl的接口,具体你可以去看看 drivers/spi/spi-rockchip-test.c

谢谢
madman

我看到了这个文件,
static const struct file_operations spi_test_fops = {
        .write = spi_test_write,
};
只有一个write函数, 我这样写对不对?
1. int fd =open("/dev/spi_misc_test", O_RDWR);
2 write(fd,buf,100);

还是没有任何输出,请指点,谢谢

作者: madman    时间: 2016-1-31 16:57
具体的实现在 static ssize_t spi_test_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)里,你看你的数据有没有写下去,读写函数应该是这些,你可以先试一下这些函数能不能正常使用先
86                 ret = spi_write(spi, txbuf, 256);^M
87                 ret = spi_read(spi, rxbuf, 255);^M
88                 ret = spi_write_then_read(spi,txbuf,254,rxbuf,253);^M
89                 ret = spi_write_and_read(spi,txbuf,rxbuf,252);^M
90                 ret = spi_write_and_read(spi,txbuf,rxbuf,251);^
然后你可以自己去改写这接口的功能

作者: iot_tech    时间: 2016-1-31 17:24
madman 发表于 2016-1-31 16:57
具体的实现在 static ssize_t spi_test_write(struct file *file, const char __user *buf, size_t count,  ...

为什么这个printk没打印出来

static ssize_t spi_test_write(struct file *file,
                        const char __user *buf, size_t count, loff_t *offset)
{
        u8 nr_buf[8];
        int nr = 0, ret;
        int i = 0;
        struct spi_device *spi = NULL;
        char txbuf[256],rxbuf[256];

        printk("%s:0:bus=0,cs=0; 1:bus=0,cs=1; 2:bus=1,cs=0; 3:bus=1,cs=1; 4:bus=2,cs=0; 5:bus=2,cs=1\n",__func__);





作者: madman    时间: 2016-1-31 17:45
有打印的,不过printk是打印在内核里,你可以接串口或者在adb里cat /proc/kmsg查看内核信息
<4>[  206.665676] spi_test_write:0:bus=0,cs=0; 1:bus=0,cs=1; 2:bus=1,cs=0; 3:bus=1,cs=1; 4:bus=2,cs=0; 5:bus=2,cs=1

作者: iot_tech    时间: 2016-1-31 18:45
madman 发表于 2016-1-31 17:45
有打印的,不过printk是打印在内核里,你可以接串口或者在adb里cat /proc/kmsg查看内核信息
[  206.665676 ...


我们这个是不是没有配置成spi模式,而是其他模式,所以spi没有数据发送出来

C:\catmsg.jpg

<4>[  130.231837] spi_test_write:0:bus=0,cs=0; 1:bus=0,cs=1; 2:bus=1,cs=0; 3:bus=1,cs=1; 4:bus=2,cs=0; 5:bus=2,cs=1
<4>[  130.231846] spi_test_write:error g_spi_test_data is null
<4>[  130.231855] spi_test_write:0:bus=0,cs=0; 1:bus=0,cs=1; 2:bus=1,cs=0; 3:bus=1,cs=1; 4:bus=2,cs=0; 5:bus=2,cs=1


<4>[  130.231863] spi_test_write:error g_spi_test_data is null
作者: madman    时间: 2016-2-1 12:52
data is null 数据是空
作者: iot_tech    时间: 2016-2-2 11:32
madman 发表于 2016-2-1 12:52
data is null 数据是空

能不能给个SPI的demo程序,通过spi读写外设的!




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1