S3C2416 SPI中斷方式實現

2021-06-16 23:29:38 字數 1604 閱讀 6209

samsung s3c2416支援hs_spi(高速序列外設介面),是一種高速的,全雙工,同步的通訊匯流排,並且在晶元的管腳上只占用四根線,節約了晶元的管腳,同時為pcb的布局上節省空間,提供方便,正是出於這種簡單易用的特性,如今越來越多的晶元整合了這種通訊協議。

將2416作為spi主站與mcp2515通訊,s3c2416採用spi中斷方式處理傳送和接收。

考慮到mcp2515spi協議,採用一問一答方式,中斷處理中需嚴格遵循一條完整指令中的傳送和接收,即傳送完應馬上處理需要的接收。

spi中斷處理流程:

1.初始化spi和中斷

void spireginit(pcan_info pcan_info)

2.傳送資料申請和接收資料申請

傳送資料申請 

rspi_int_en |= int_tx_fifordy;//開啟準備傳送中斷

接收申請

這裡可以按需設定觸發等級來觸發接收fifo準備中斷,觸發等級為0~64位元組

rmode_cfg |= rx_trig_lvl(1);//設定接收中斷觸發等級

rspi_int_en |= int_tx_fifordy;//開啟接收中斷

3.中斷處理傳送接收

void __irq mcp2515_spiinthandler(void)

opertotal = 64 - ((status>>6) & 0x7f);

rpending_clr = 0x1f;

while (itxque.que, &pspi_data, (dword)1, false))

totaltimeout = write_time_out_constant*50 + (write_time_out_multiplier)*(i-1);

txdone(totaltimeout);//等待傳送完成

rch_cfg &= ~ch_txch_on;

if (g_byreadreg)

}else if (status & stus_rx_fifordy /*|| status & stus_trailcnt_zero*/)//接收中斷

;i = 0;

opertotal = (status>>13) & 0x7f;//data level in rx fifo

totaltimeout = read_time_out_constant*50 + (read_time_out_multiplier)*opertotal;

while(irxque.que, &pspi_data, 1, false))

rch_cfg &= ~ch_rxch_on;

g_byreadreg = 0;

}if (!g_byreadreg)

clearpending(1 << (pspiinfo->dwspiintno-0x20));

rintmsk &= ~(((dword)0x1)<<(pspiinfo->dwspiintno-0x20));//取消遮蔽}

4.除錯過程

a.當packet_count_reg(ch0)= 1<<16 | (1)時,傳送資料時只能傳送1個位元組的資料,其餘資料在fifo中發布出去。這個問題比較奇怪,不知道是我的spi配置有問題還是s3c2416的bug?還望有知道的童鞋解釋解釋。

S3C2416 TIMER 中斷的使用

最近使用 s3c2416 做乙個控制裝置,需要實現 us 級別的中斷 而且還不能用 for 迴圈來實現,因為for迴圈是暫用資源的計時。cpu開銷太大。看了一下 datasheet 裡面有 5 個timer timer0 3 pwm 輸出,timer4 系統 tick timer4 tick tim...

s3c2416 U Boot移植筆記

首先說,今天是乙個值得高興的日子,因為經過四天的努力,終於把u boot1.3.4成功移植到了s3c2416上.板子要求是sd卡啟動,以下具體的移植步聚 一 sd起動首先要修改 include configs smdk2416.h標頭檔案 在365行左右,按如下修改 define config bo...

S3C6410按鍵驅動 中斷方式

本文 cpp view plain copy include include include include include include include include include include include include include 新版核心 include include st...