1. 程式人生 > >新路程------imx6 spi cc1101遇到的坑

新路程------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快取這個過程。