国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

SPI,MCP2515調(diào)試總結(jié)

2019-11-09 14:30:06
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

轉(zhuǎn)自http://www.xuebuyuan.com/2055253.html

MCP2515是一SPI轉(zhuǎn)CAN總線的芯片,對(duì)于CPU來(lái)說(shuō),CPU就是主設(shè)備,SPI就是從設(shè)備,所以在內(nèi)核里,MCP2515就是一個(gè)SPI設(shè)備,而SPI設(shè)備在內(nèi)核中的結(jié)構(gòu)是對(duì)應(yīng)的,是一個(gè)spi控制器對(duì)應(yīng)一個(gè)SPI設(shè)備,也就是一個(gè)spi_master對(duì)應(yīng)一個(gè)spi設(shè)備,而SPI設(shè)備在內(nèi)核中,尤其是新的內(nèi)核中(新的內(nèi)核越來(lái)越注重分層和分離的結(jié)構(gòu)),則是在驅(qū)動(dòng)中填充spi_driver驅(qū)動(dòng)信息,在板載中填充spi_board_info信息.

要移植好SPI設(shè)備,有幾點(diǎn)是要注意的.

1,make menuconfig中,CONFIG_SPI_S3C54XX和SPI_SPIDEV這兩個(gè)及其相關(guān)的選項(xiàng)需要打開(kāi),因?yàn)榈谝粋€(gè)是spi控制器(驅(qū)動(dòng)在dev-spi.c里),第二個(gè)就是SPI設(shè)備.

2,當(dāng)然作為主角的MCP251x.c的驅(qū)動(dòng)選項(xiàng)頁(yè)當(dāng)然要打開(kāi),內(nèi)核中,MCP251X.C這個(gè)源碼已經(jīng)包含,在drivers/net/can下,檢查下Makefile和Kconfig,然后menuconfig里打開(kāi)編譯選項(xiàng),這一步大概也不會(huì)有什么問(wèn)題.唯一要注意的是在此源碼中,需要改一下DEVICE_NAME這個(gè)宏,要跟下面提到的modalias一致,因?yàn)檫@是用來(lái)match用的.

3,SPI控制器好了,SPI設(shè)備驅(qū)動(dòng)有了,那就還差的是SPI控制器配置,SPI的設(shè)備信息等的填充了.在/arch/arm/mach-exynos/下的machine_init函數(shù)所在源碼文件中添加填充

static struct s3c64xx_spi_csinfo spi0_csi[]=//這個(gè)結(jié)構(gòu)體用來(lái)設(shè)置片選引腳的{[0] = {.line = //片選引腳.set_level = gpio_set_value,.fb_delay = 0x2,},};static struct mcp251x_platform_data mcp251x_info//這個(gè)結(jié)構(gòu)體用來(lái)設(shè)置振蕩器頻率的,至于剩下的參數(shù)要不要設(shè),需要具體看原理圖的接線情況,頭文件在///include/linux/can/platform/mcp251x.hstatic struct spi_board_info spi0_board_info[]=//這個(gè)結(jié)構(gòu)體用來(lái)配置SPI設(shè)備,也就是對(duì)應(yīng)MCP251X.c這個(gè)設(shè)備驅(qū)動(dòng)用的,注意modalias要對(duì)上.{.modalias = ,//要跟mcp251x.c上的DEVICE_NAME宏對(duì)上.max_speed_hz = ,//CPU支持最高50MHz,但MCP2515芯片最高只支持到10MHZ,這里要好好權(quán)衡一下.bus_num = ,//SPI總線的選擇,CPU提供3條SPI總線.chip_select = ,//SPI總線上第幾個(gè)設(shè)備的選擇.mode = SPI_MODE_0,//關(guān)于CPOL CPHA這2個(gè)值得選擇,有4種模式 00 01 10 11.platform_data = &mcp251x_info,//傳給mcp251x.c驅(qū)動(dòng)用的參數(shù),就是上面的一個(gè)結(jié)構(gòu)體..controller_data = &spi0_csi[0],//上面的一結(jié)構(gòu)體,片選所用.irq = ,//mcp2515芯片有一中斷腳連到CPU,把復(fù)用后的中斷量復(fù)制在此}

這三個(gè)結(jié)構(gòu)體填充完后(記得加上相應(yīng)的頭文件),就在static struct platform_device上添加初始化用的設(shè)備的變量exynos_device_spi的地址,這是給machine_init函數(shù)在添加這三個(gè)變量的時(shí)候用的,

struct clk *sclk = NULL;struct clk *PRnt = NULL;struct device *spi0_dev = &exynos_device_spi0.dev;sclk = clk_get(spi0_dev, "dout_spi0");if (IS_ERR(sclk))dev_err(spi0_dev, "failed to get sclk for SPI-0/n");prnt = clk_get(spi0_dev, "mout_mpll_user");if (IS_ERR(prnt))dev_err(spi0_dev, "failed to get prnt/n");if (clk_set_parent(sclk, prnt))printk(KERN_ERR "Unable to set parent %s of clock %s./n",prnt->name, sclk->name);

clk_set_rate(sclk, 10 * 1000 * 1000);clk_put(sclk);clk_put(prnt);

if (!gpio_request(片選引腳宏地址, 片選引腳名)) {gpio_direction_output(片選引腳宏地址, 1);s3c_gpio_cfgpin(片選引腳宏地址, S3C_GPIO_SFN(1));s3c_gpio_setpull(片選引腳宏地址, S3C_GPIO_PULL_UP);exynos_spi_set_info(0, EXYNOS_SPI_SRCCLK_SCLK,ARRAY_SIZE(spi0_csi));}spi_register_board_info(spi0_board_info, ARRAY_SIZE(spi0_board_info));

而這里主要是注冊(cè)SPI設(shè)備和SPI的時(shí)鐘配置,配置好這些后正常的話就已經(jīng)把mcp2515的can0設(shè)備驅(qū)動(dòng)移植好了.如果在這里出了問(wèn)題,不防先設(shè)置好spidev.c的驅(qū)動(dòng),先調(diào)好spi的控制器,再把spidev替換成mcp2515.

4,CAN總線在新版本的內(nèi)核中,并不是以字符設(shè)備的形式出現(xiàn)的,原因內(nèi)核也有說(shuō)明,主要是因?yàn)閮?nèi)核把CAN設(shè)備看成了網(wǎng)絡(luò)設(shè)備(當(dāng)然由于CAN設(shè)備的特殊性,CAN是沒(méi)有IP地址可言的),需要用到socketcan協(xié)議,所以要想運(yùn)行CAN總線,那么就要再menuconfig上打開(kāi)can的協(xié)議(打開(kāi)項(xiàng)在Networking support-->CAN bus subsystem support下).

5,內(nèi)核部分完成后,就到Android部分了,由于不是字符設(shè)備,不能對(duì)其進(jìn)行簡(jiǎn)單的讀寫(xiě)操作,所以要用到2個(gè)工具,iproute2 和 canutiliproute2在安卓源碼上就有,external/iproute2,而canutil則在網(wǎng)上可以下到,而是用canutil內(nèi)的命令,還需要用到libsocketcan的庫(kù).

調(diào)試總結(jié):在剛開(kāi)始調(diào)試的時(shí)候,spi在內(nèi)核中的框架并不熟悉,困惑于spidev.c和mcp251x.c之間的關(guān)系怎么處理,spi的設(shè)備怎么設(shè)置時(shí)鐘,為什么mcp251x.c驅(qū)動(dòng)調(diào)出來(lái)之后再spi下的目錄里沒(méi)有mcp251x的字符設(shè)備可供調(diào)用等等.其實(shí)spidev跟mcp251x是處于同一位置的spi設(shè)備,都由spi控制器控制,或許是可以在spi0_board_info結(jié)構(gòu)體填充chip_select的時(shí)候填上排序的序號(hào),可是最后沒(méi)有用上,因?yàn)閟pidev不是一個(gè)實(shí)質(zhì)的設(shè)備.而spi下沒(méi)有mc251x的字符設(shè)備供調(diào)用是因?yàn)閙cp251x的驅(qū)動(dòng)節(jié)點(diǎn)在net/can0里,意味著內(nèi)核把它注冊(cè)為網(wǎng)絡(luò)設(shè)備.這里在調(diào)試的時(shí)候最好還是先用spidev來(lái)先調(diào)好spi控制器,因?yàn)閟pidev的驅(qū)動(dòng)提供了可調(diào)用的 spi下的字符設(shè)備節(jié)點(diǎn),而在內(nèi)核中,已經(jīng)提供了spi設(shè)備的測(cè)試代碼在document/spi下,在編譯好后放到開(kāi)發(fā)板上,并將spi發(fā)送接收的2條線接上,那么正常的情況下spi就能實(shí)現(xiàn)自收自發(fā),這時(shí)再去調(diào)試mcp251x.c的驅(qū)動(dòng),就可以不用擔(dān)心spi在系統(tǒng)上出太大問(wèn)題了(不過(guò)關(guān)于時(shí)鐘這一部分,需要好好地配置).然后再測(cè)試can接口的時(shí)候,iproute2這個(gè)工具出現(xiàn)過(guò)bitrate這個(gè)參數(shù)無(wú)法辨認(rèn)的情況,其實(shí)是在iproute2/ip目錄下對(duì)iplink_can.c并沒(méi)有實(shí)際調(diào)用,歸根到底,是在編譯android的時(shí)候,某些iplink_can.c內(nèi)某些頭文件沒(méi)有順利調(diào)用導(dǎo)致最后ip命令的參數(shù)不支持can,最后吧頭文件的include寫(xiě)成了相對(duì)地址來(lái)調(diào)用,就可以了.而對(duì)于canutil這個(gè)工具,要順利編譯好,也經(jīng)過(guò)了一些波折,自己用的編譯器比較多,環(huán)境變量不全,是個(gè)挺麻煩的問(wèn)題,最后自己添加了環(huán)境變量,同時(shí)無(wú)視了伯克利相關(guān)的庫(kù)后,勉強(qiáng)編譯成功了cansend candump canecho和cansequence四個(gè)工具去調(diào)用.現(xiàn)在,使用ip link set can0 type can bitrate xxx這些命令來(lái)設(shè)置波特率,用cansend和candump來(lái)發(fā)送接收,能用示波器看到波形了,但是數(shù)據(jù)在接收那邊還沒(méi)能出來(lái),這個(gè)在之后得后續(xù)更新原因.

6、本文主要驗(yàn)證Linux-imx_share/Documentation/spi目錄下spidev_test.c的測(cè)試?yán)蹋芊裾?刂芐PI接口。在命令行下輸入ifconfig -a,已經(jīng)出現(xiàn)can0信息


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 海安县| 天门市| 青神县| 万载县| 闽清县| 泸水县| 高碑店市| 安图县| 石泉县| 顺义区| 崇明县| 理塘县| 绥阳县| 东宁县| 乡宁县| 梁山县| 铅山县| 安丘市| 保定市| 陇川县| 乌审旗| 萨嘎县| 徐州市| 枣庄市| 五指山市| 泾川县| 教育| 南投市| 天水市| 来安县| 玉林市| 惠水县| 广东省| 周口市| 资兴市| 博湖县| 青浦区| 溧阳市| 绥芬河市| 菏泽市| 溧阳市|