新路程------imx6 spi cc1101遇到的坑

最近搞cc1101,遇到的坑不少

首先是读写的坑,一开始burst读一直不成功,看了数据手册30页,read的地址后面跟的是个X,其实意思是任意数字,也就是你读的时候第一个byte是地址,第二个byte要填一个任意数字才能读出数据。


第二个坑是spidev.c中,我在系统启动过程中调用自己的read,始终报错,后来一看才明白

struct spidev_data {
dev_t devt;
spinlock_t spi_lock;
struct spi_device*spi;
struct list_headdevice_entry;


/* buffer is NULL unless this device is open (users > 0) */这句话很重要,初始化过程没有分配空间给buf,所以直接read/write去用buffer就会kernel panic
struct mutex buf_lock;
unsigned users;
u8 *buffer;
};

然后看了为啥应用层就可以调用呢,因为open的时候分配了空间,还好没浪费太多的时间


第三个坑是发送数据长度,由于我选的是可变数据长度,所以写入fifo的第一个byte是地址byte+有效数据长度,如果只有有效数据长度,会导致发送后进入underflow状态,而接收方虽然能接收到有效数据,却会出现crc校验错误。

第四个坑是发送kernel panic,然后说空指针,后来才发现是因为read和write操作没有加锁,中断的下半部分workqueue去读,而程序本身又去读,导致用了同一个buffer,所以系统挂了

还有所谓的同步模式,就是不需要fifo,也就是cc1101收到数据直接通过GDO的那几个pin发送给mcu,也就是没有fifo缓存这个过程。

你可能感兴趣的:(新路程------imx6 spi cc1101遇到的坑)