- 論壇徽章:
- 0
|
本帖最后由 vacdvacd 于 2014-12-01 15:48 編輯
最近要寫一個(gè)基于Linux的SPI子系統(tǒng)的驅(qū)動(dòng)。
我首先是先看了看其他的如MCP2515的驅(qū)動(dòng)、drivers/spi/spidev.c中的內(nèi)容以及AT25.c等。
現(xiàn)在是想要讀我外設(shè)上面的寄存器信息。
SPI總線上的數(shù)據(jù)格式如下:
數(shù)據(jù)在時(shí)鐘上升沿有效。
發(fā)送:0x22,0x00
返回:0x00,0x03
其中,0x22是slave設(shè)備上的寄存器地址,0x00代表本條發(fā)送指令結(jié)束.具體的時(shí)序如:
搜狗截圖20141201153634.jpg (12.56 KB, 下載次數(shù): 67)
下載附件
2014-12-01 15:30 上傳
我使用的是6410板子,當(dāng)然控制器驅(qū)動(dòng)就直接用的是drivers/spi/spi_s3c.c
在mach-xxx中添加了我的spi_board_info信息,
現(xiàn)在init的時(shí)候注冊(cè)spi驅(qū)動(dòng)核心,運(yùn)行probe的時(shí)候初始化一些數(shù)據(jù)結(jié)構(gòu)成員,設(shè)備節(jié)點(diǎn)文件也創(chuàng)建完成。
但是現(xiàn)在我無(wú)論是直接使用spi_async()來(lái)進(jìn)行數(shù)據(jù)同步,還是使用spi_write_then_read()來(lái)進(jìn)行數(shù)據(jù)同步,都是讀不出我想要的數(shù)據(jù),我測(cè)試的方法就是發(fā)送0x22,0x00,然后讀數(shù)據(jù),循環(huán)進(jìn)行試驗(yàn),但是就是讀不出來(lái)正確的數(shù)據(jù)(通過(guò)示波器測(cè)量,確定返回?cái)?shù)據(jù)波形沒(méi)有問(wèn)題,和我畫的時(shí)序圖吻合),讀出的數(shù)據(jù)很奇怪,而當(dāng)我把MOSI接到GND也確實(shí)讀的全是0,我很奇怪,就把DMA和SPI核心的debug打印打開了,如下:
[21474620.530000] s3c2410_dma_config: chan=33, xfer_unit=1, dcon=00000000
[21474620.530000] s3c2410_dma_config: Initial dcon is 00000000
[21474620.535000] s3c2410_dma_config: New dcon is 00000000
[21474620.540000] s3c2410_dma_config: DMA Channel control : 00000000
[21474620.545000] s3c2410_dma_config: dcon now 89000000
[21474620.550000] s3c2410_dma_enqueue: id=cf1e2940, data=5f300000, size=2
[21474620.555000] s3c2410_dma_enqueue: new buffer cf318000
[21474620.560000] s3c2410_dma_enqueue: buffer cf318000 queued onto empty channel
[21474620.560000] s3c_dma_waitforload channel number : 0
[21474620.575000] s3c2410_dma_config: chan=34, xfer_unit=1, dcon=00000000
[21474620.580000] s3c2410_dma_config: Initial dcon is 00000000
[21474620.585000] s3c2410_dma_config: New dcon is 00000000
[21474620.590000] s3c2410_dma_config: DMA Channel control : 00000000
[21474620.600000] s3c2410_dma_config: dcon now 86000000
[21474620.605000] s3c2410_dma_enqueue: id=cf1e2940, data=5f2fc000, size=2
[21474620.610000] s3c2410_dma_enqueue: new buffer cf318040
[21474620.615000] s3c2410_dma_enqueue: buffer cf318040 queued onto empty channel
[21474620.615000] s3c_start_dma: channel number=1, index=1
[21474620.615000] s3c_chan_loadbuffer: loading buffer cf318040 (0x5f2fc000,0x000002)
[21474620.615000] s3c_dma_loadbuffer: DMA control0 - 86000000
[21474620.615000] s3c_dma_loadbuffer: DMA control1 - 00000002
[21474620.615000] s3c_dma_start:wrote 00008b01 to S3C_DMAC_CxCONFIGURATION.
[21474620.650000] # s3c_dma_irq: TC status : 0x2
[21474620.650000] # DMA Controller 0: requestor 1
[21474620.650000] # DMA channel number : 1, index : 1
[21474620.650000] callback_fn will be called=c02585c4, buf=cf318040, id=cf1e2940, size=2, result=0
[21474620.650000] DMA CH 1: s3c_dma_lastxfer: load_state 0
[21474620.650000] DMA CH 1: s3c_dma_lastxfer: load_state : S3C2_DMALOAD_NONE0
[21474620.650000] # DMA CH 1(index:1): end of transfer, stopping channel (-43166)
[21474620.650000] s3c_dma_dostop: DMA Channel No : 1
[21474620.650000] s3c_dma_dostop: S3C_DMAC_CxCONFIGURATION : 00048b00
[21474620.650000] # s3c_dma_irq: TC status : 0x0
[21474620.710000] # s3c_dma_irq: TC status : 0x1
[21474620.710000] # DMA Controller 0: requestor 0
[21474620.710000] # DMA channel number : 0, index : 0
[21474620.710000] callback_fn will be called=c025861c, buf=cf318000, id=cf1e2940, size=2, result=0
[21474620.710000] DmaRx-2 [RX-OK]s3c_chan_loadbuffer: loading buffer cf318000 (0x5f300000,0x000002)
[21474620.710000] s3c_dma_loadbuffer: DMA control0 - 89000000
[21474620.710000] s3c_dma_loadbuffer: DMA control1 - 00000002
[21474620.710000] # s3c_dma_irq: TC status : 0x0
[21474620.755000] [ read_reg: 237] Read Data[0]=0x0
[21474620.760000] [ read_reg: 237] Read Data[1]=0x0
[21474620.765000] [ read_reg: 237] Read Data[2]=0x0
[21474620.770000]
而我read部分的主要代碼如下:(chip-->tx_buffer中是我發(fā)送的數(shù)據(jù)0x22,0x00,而chip->rx_buffer用于接收數(shù)據(jù))
DECLARE_COMPLETION_ONSTACK(done);
struct spi_transfer t = {
.tx_buf = chip->tx_buffer,
.rx_buf = chip->rx_buffer,
.len = len+1,
.delay_usecs = 1000,
.bits_per_word = 8,
.cs_change = 0,
};
struct spi_message m;
spi_message_init(&m);
spi_message_add_tail(&t, &m);
m.complete = xxx_complete;
m.context = &done;
spin_lock_irq(chip->spin_lock);
ret = spi_async(spi, &m);
spin_unlock_irq(chip->spin_lock);
if(ret == 0){
wait_for_completion(&done);
ret = m.status;
if(ret == 0){
ret = m.actual_length;
}
}
if (ret < 0) {
printk("[%20s:%4d] ERROR:sp_saync Failed\n",__FUNCTION__,__LINE__);
}else{
for(i=0;i<ret+1;i++){
printk("[%20s:%4d] Read Data[%d]=0x%x\n",
__FUNCTION__, __LINE__, i, chip->rx_buffer);
}
}
目前spi驅(qū)動(dòng)核心的機(jī)制應(yīng)該是將我發(fā)送的數(shù)據(jù)add到工作隊(duì)列中去發(fā)送,而工作隊(duì)列的work處理函數(shù)應(yīng)該是是采用的DMA+中斷的方式,請(qǐng)問(wèn)我現(xiàn)在接收的數(shù)據(jù)出現(xiàn)問(wèn)題,有可能是什么方面的問(wèn)題呢??我是菜鳥一個(gè),希望各位大俠點(diǎn)撥一下,不甚感激。!
|
|