怎么在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上不适用么?

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

那个不是ioctl的接口,具体你可以去看看 drivers/spi/spi-rockchip-test.c

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);

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

具体的实现在 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);^
然后你可以自己去改写这接口的功能

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);

有打印的,不过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

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

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

<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

data is null 数据是空

madman 发表于 2016-2-1 12:52
data is null 数据是空

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