chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【S32K146 RT-thread】之 SPI驅(qū)動(dòng)適配

RT-Thread官方賬號(hào) ? 2024-11-01 08:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

概述

RT-Thread 對(duì)SPI總線(xiàn)的驅(qū)動(dòng),抽象出了spi bus 的設(shè)備驅(qū)動(dòng),我們基于S32K146 的硬件學(xué)習(xí)spi bus 設(shè)備驅(qū)動(dòng)。

SPI總線(xiàn)驅(qū)動(dòng)適配

驅(qū)動(dòng)涉及的主要結(jié)構(gòu)體為如下:

rt_spi_device:app 通過(guò)該結(jié)構(gòu)體和bus 綁定通過(guò)bus 控制spi總線(xiàn)

rt_spi_bus spi bus總線(xiàn)設(shè)備抽象

rt_spi_ops bus設(shè)備依賴(lài)的底層操作函數(shù)

結(jié)構(gòu)體關(guān)系如下:

c7eba39e-97e5-11ef-8084-92fbcf53809c.jpg

對(duì)于總線(xiàn)設(shè)備的驅(qū)動(dòng)對(duì)接我們需要實(shí)現(xiàn)對(duì)應(yīng)的ops函數(shù)。

使用S32 Design Studio 工具配置spi1

本次實(shí)驗(yàn)使用的是lpspi1 ,首先使用S32 Design Studio 工具生成pinmux 和 clk 初始化配置代碼。

配置SPI1 master 參數(shù)

c7f25e8c-97e5-11ef-8084-92fbcf53809c.jpg

配置pimmux

c80a97cc-97e5-11ef-8084-92fbcf53809c.jpg

配置clk

c8329c68-97e5-11ef-8084-92fbcf53809c.jpg

適配SPI1 ops 函數(shù)至RT-Thread

根據(jù)上面的梳理,依賴(lài)芯片層實(shí)現(xiàn)ops函數(shù)并開(kāi)啟spi設(shè)備驅(qū)動(dòng)

c8394306-97e5-11ef-8084-92fbcf53809c.png

config ops函數(shù)

tatic rt_err_t spi_configure(struct rt_spi_device* device,
struct rt_spi_configuration* configuration)
{
struct rt_spi_bus * spi_bus = (struct rt_spi_bus *)device->bus;
struct s32k_spi *spi_device = (struct s32k_spi *)spi_bus->parent.user_data;
status_t ret;


RT_ASSERT(device != RT_NULL);
RT_ASSERT(configuration != RT_NULL);


/* config spi init spi bus */
//LPSPI_DRV_MasterDeinit(spi_device->instance);


switch(configuration->mode & RT_SPI_MODE_3)
{
case RT_SPI_MODE_0:
spi_device->masterconfig->clkPhase = LPSPI_CLOCK_PHASE_2ND_EDGE;
spi_device->masterconfig->clkPolarity = LPSPI_SCK_ACTIVE_LOW;
break;
case RT_SPI_MODE_1:
spi_device->masterconfig->clkPhase = LPSPI_CLOCK_PHASE_1ST_EDGE;
spi_device->masterconfig->clkPolarity = LPSPI_SCK_ACTIVE_LOW;
break;
case RT_SPI_MODE_2:
spi_device->masterconfig->clkPhase = LPSPI_CLOCK_PHASE_2ND_EDGE;
spi_device->masterconfig->clkPolarity = LPSPI_SCK_ACTIVE_HIGH;
break;
case RT_SPI_MODE_3:
spi_device->masterconfig->clkPhase = LPSPI_CLOCK_PHASE_1ST_EDGE;
spi_device->masterconfig->clkPolarity = LPSPI_SCK_ACTIVE_HIGH;
break;
}


/* MSB or LSB */
if(configuration->mode & RT_SPI_MSB)
{
spi_device->masterconfig->lsbFirst = false;
}
else
{
spi_device->masterconfig->lsbFirst = true;
}


if(configuration->max_hz < 10000000)
spi_device->masterconfig->bitsPerSec = configuration->max_hz;


spi_device->masterconfig->bitcount = configuration->data_width;


ret = LPSPI_DRV_MasterInit(spi_device->instance,spi_device->status,spi_device->masterconfig);
RT_ASSERT(ret == STATUS_SUCCESS);


ret = LPSPI_DRV_MasterSetDelay(spi_device->instance, 1, 1, 1);
RT_ASSERT(ret == STATUS_SUCCESS);


return ret == STATUS_SUCCESS ? RT_EOK:RT_ERROR;

xfer ops 函數(shù)

truct s32k_spi
{
struct rt_spi_bus spi_bus; /* spi bus device */
lpspi_master_config_t * masterconfig; /* lpspi master config */
lpspi_state_t * status; /* lpspi driver status */
uint32_t instance; /* spi instance id */
char * bus_name;
}s32k_spi_t;


static rt_ssize_t spixfer(struct rt_spi_device* device, struct rt_spi_message* message){
struct rt_spi_bus * spi_bus = (struct rt_spi_bus *)device->bus;
struct s32k_spi *spi_device = (struct s32k_spi *)spi_bus->parent.user_data;
status_t ret;


RT_ASSERT(device != NULL);
RT_ASSERT(message != NULL);




ret = LPSPI_DRV_MasterTransferBlocking(spi_device->instance,message->send_buf,message->recv_buf,message->length,1000);
RT_ASSERT(ret == STATUS_SUCCESS);


return ret == STATUS_SUCCESS ? message->length:0;

添加如下初始化代碼像系統(tǒng)注冊(cè)spibus設(shè)備

xtern void LPSPI_DRV_IRQHandler(uint32_t instance);


void S32K14X_LPspi1_Master_Slave_IRQHandler(void){
/* enter interrupt */
rt_interrupt_enter();


LPSPI_DRV_IRQHandler(1);


/* leave interrupt */
rt_interrupt_leave();
}


/* private rt-thread spi ops function */
static struct rt_spi_ops s32k_spi_ops =
{
.configure = spi_configure,
.xfer = spixfer,
};


static struct s32k_spi spi1;




int rt_hw_spi_init(void){
int result = 0;


/* config spi strruct */
spi1.instance = INST_LPSPI_1;
spi1.masterconfig = &lpspi_1_MasterConfig0;
spi1.status = &lpspi_1State;
spi1.spi_bus.parent.user_data = (void *)&spi1;
spi1.bus_name = "spi1";


result = rt_spi_bus_register(&spi1.spi_bus, spi1.bus_name, &s32k_spi_ops);


RT_ASSERT(result == RT_EOK);


LOG_D("%s bus init done", spi1.bus_name);


if(result == RT_EOK)
{
INT_SYS_InstallHandler(LPSPI1_IRQn,S32K14X_LPspi1_Master_Slave_IRQHandler,NULL);
}




return result;
}


INIT_APP_EXPORT(rt_hw_spi_init);

驗(yàn)證

添加如下測(cè)試代碼輸入 spi10 open/config/readid 命令打開(kāi)并掛載到spi1總線(xiàn),并讀取板子上的spi flash 的id信息

include
#include
#include
#include
#include


#define SPF_R_JEDEC_CMD (0x9Fu)
#define SPF_R_JEDEC_LEN (4u)


struct rt_spi_device spi1_device;


static void spi10(int argc,char *argv[]){
rt_err_t ret;
struct rt_spi_configuration cfg;
uint8_t sendbuff[4] = {SPF_R_JEDEC_CMD,0x00,0x00,0x00};
uint8_t recvbuff[4] = {0x00,0x00,0x00,0x00};


if(!strcmp(argv[1], "readid"))
{
rt_spi_transfer(&spi1_device,sendbuff,recvbuff,4);
rt_kprintf("read did [%x][%x][%x]\n",recvbuff[1],recvbuff[2],recvbuff[3]);
}
else if(!strcmp(argv[1], "open"))
{
ret = rt_spi_bus_attach_device(&spi1_device,"spi10","spi1",NULL);
if(ret != RT_EOK)
rt_kprintf("attach spi1 faied %d\n",ret);
}
else if(!strcmp(argv[1], "config"))
{
cfg.data_width = 8;
cfg.max_hz = 8000000;
cfg.mode = RT_SPI_MODE_3 | RT_SPI_MSB;
rt_spi_configure(&spi1_device,&cfg);
}
else if(!strcmp(argv[1], "read"))
{


}
}
MSH_CMD_EXPORT(spi10,spi10flashtest)

輸入命令驗(yàn)證已經(jīng)讀取到flash 的Id 信息說(shuō)明SPI 總線(xiàn)和spi flash 通信ok ,而且系統(tǒng)內(nèi)也已經(jīng)多了spi1 bus設(shè)備和spi10 的spi 設(shè)備節(jié)點(diǎn)。

c84fc220-97e5-11ef-8084-92fbcf53809c.jpg

試驗(yàn)讀取的did和芯片手冊(cè)的也是一致的。

c8564b7c-97e5-11ef-8084-92fbcf53809c.jpg

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SPI總線(xiàn)
    +關(guān)注

    關(guān)注

    4

    文章

    109

    瀏覽量

    28473
  • 設(shè)備驅(qū)動(dòng)

    關(guān)注

    0

    文章

    71

    瀏覽量

    11345
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1614

    瀏覽量

    44888
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RT-Thread NUC97x 移植 LVGL

    不涉及 rt-thread 驅(qū)動(dòng),但是它是 LVGL 和 rt-thread 的接口。LVGL 在 rt-thread 上運(yùn)行的基石。
    發(fā)表于 07-08 09:37 ?2113次閱讀

    基于RT-ThreadSPI通訊

    ? ? ?sdk 目前還不支持 spi,沒(méi)有 spi 就失去了很多樂(lè)趣,如 easyflash、spi 的屏幕,藍(lán)訊的這次活動(dòng)我接到了模擬 spi 的任務(wù),下面介紹如何寫(xiě)
    的頭像 發(fā)表于 08-22 09:28 ?2842次閱讀

    RT-Thread ssd1306驅(qū)動(dòng)

    RT-Thread 驅(qū)動(dòng)ssd1306
    的頭像 發(fā)表于 04-21 10:08 ?26.6w次閱讀
    <b class='flag-5'>RT-Thread</b> ssd1306<b class='flag-5'>驅(qū)動(dòng)</b>

    S32K146的hard fault問(wèn)題解決方案

    最近有個(gè)客戶(hù)使用S32K146的產(chǎn)品在量產(chǎn)之后出現(xiàn)了三個(gè)售后件,ABBA測(cè)試之后的結(jié)果表明失效現(xiàn)象跟著S32K146走;同時(shí)客戶(hù)反饋說(shuō)試著將其中一個(gè)售后件重新燒錄程序,S32K146又正常工作了。結(jié)合這兩種情況,
    的頭像 發(fā)表于 11-22 11:35 ?5550次閱讀
    <b class='flag-5'>S32K146</b>的hard fault問(wèn)題解決方案

    基于MM32F5270開(kāi)發(fā)板RT-Thread SPI驅(qū)動(dòng)適配指南

    1、第一次給RT-Thread添加芯片SPI驅(qū)動(dòng)  為MM32F5370開(kāi)發(fā)板添加SPI驅(qū)動(dòng)支持的過(guò)程。
    發(fā)表于 09-02 14:59

    如何使用RT-Thread SPI設(shè)備驅(qū)動(dòng)

    ,RT-Thread中引入了SPI設(shè)備驅(qū)動(dòng)框架。本文說(shuō)明了如何使用RT-Thread SPI設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-25 14:20

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開(kāi)發(fā)組(2015-03-31)。RT-Thread做為國(guó)內(nèi)有較大影響力的開(kāi)源實(shí)時(shí)操作系統(tǒng),本文是RT-Thread實(shí)時(shí)操作系統(tǒng)的編程指南
    發(fā)表于 11-26 16:06 ?0次下載

    RT-ThreadSPI的細(xì)節(jié)內(nèi)容

    作為通信協(xié)議的兩大基礎(chǔ),IIC和SPI兩者的應(yīng)用都非常廣泛,上一篇文章講過(guò)了RTT上IIC的移植與實(shí)踐。 《一步到位!教你RT-Thread上設(shè)備IIC驅(qū)動(dòng)移植》 講完IIC,自然少不了SPI
    的頭像 發(fā)表于 09-30 15:35 ?4773次閱讀
    <b class='flag-5'>RT-Thread</b>上<b class='flag-5'>SPI</b>的細(xì)節(jié)內(nèi)容

    RT-Thread (2) RTT SPI設(shè)備驅(qū)動(dòng)流程 || LWIP + ENC28J60

    系列文章目錄RT-Thread (1) 添加外部?jī)?nèi)存到內(nèi)存管理RT-Thread (2) RTT SPI設(shè)備驅(qū)動(dòng)流程 || LWIP + ENC28J60目錄0 概述0.0 參考資料0
    發(fā)表于 11-19 14:21 ?15次下載
    <b class='flag-5'>RT-Thread</b> (2) RTT <b class='flag-5'>SPI</b>設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>流程 || LWIP + ENC28J60

    RT-Thread Studio驅(qū)動(dòng)SD卡

    RT-Thread Studio驅(qū)動(dòng)SD卡前言一、創(chuàng)建基本工程1、創(chuàng)建Bootloader2、創(chuàng)建項(xiàng)目工程二、配置RT-Thread Settings三、代碼分析1.引入庫(kù)2.讀入數(shù)據(jù)四、效果驗(yàn)證
    發(fā)表于 12-27 19:13 ?20次下載
    <b class='flag-5'>RT-Thread</b> Studio<b class='flag-5'>驅(qū)動(dòng)</b>SD卡

    RT-Thread文檔_RT-Thread 簡(jiǎn)介

    RT-Thread文檔_RT-Thread 簡(jiǎn)介
    發(fā)表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡(jiǎn)介

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread文檔_SPI 設(shè)備

    RT-Thread文檔_SPI 設(shè)備
    發(fā)表于 02-22 18:36 ?3次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>SPI</b> 設(shè)備

    S32K146 RT-Thread 使用SFUD組件驅(qū)動(dòng)spi flash

    S32K146 RT-Thread 使用SFUD組件驅(qū)動(dòng)spi flash
    的頭像 發(fā)表于 11-21 01:05 ?1946次閱讀
    【<b class='flag-5'>S32K146</b> <b class='flag-5'>RT-Thread</b>】<b class='flag-5'>之</b> 使用SFUD組件<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>spi</b> flash

    SPI玩轉(zhuǎn)WiFi,RT-Thread ESP-Hosted驅(qū)動(dòng)深度適配指南 | 技術(shù)集結(jié)

    還在為MCU的WiFi連接方案發(fā)愁?RT-Thread社區(qū)開(kāi)源ESP-Hosted驅(qū)動(dòng),通過(guò)標(biāo)準(zhǔn)SPI接口即可實(shí)現(xiàn),并且該倉(cāng)庫(kù)已整理成RT-Thread軟件包。
    的頭像 發(fā)表于 07-09 19:03 ?1655次閱讀
    用<b class='flag-5'>SPI</b>玩轉(zhuǎn)WiFi,<b class='flag-5'>RT-Thread</b> ESP-Hosted<b class='flag-5'>驅(qū)動(dòng)</b>深度<b class='flag-5'>適配</b>指南 | 技術(shù)集結(jié)