当前位置: 首页 > news >正文

wordpress 企业站主题武汉网络推广seo

wordpress 企业站主题,武汉网络推广seo,WordPress各种标签调用集合,云主机如何上传网站介绍 SPI总线由摩托罗拉公司开发,是一种全双工同步串行总线,由四个IO口组成:CS、SCLK、MISO、MOSI;通常用于CPU和外设之间进行通信,常见的SPI总线设备有:TFT LCD、QSPI FLASH、时钟模块、IMU等&#xff1b…

介绍

SPI总线由摩托罗拉公司开发,是一种全双工同步串行总线,由四个IO口组成:CS、SCLK、MISO、MOSI;通常用于CPU和外设之间进行通信,常见的SPI总线设备有:TFT LCD、QSPI FLASH、时钟模块、IMU等;NXP-MCXA153开发板上集成了两路SPI总线,本次实验将重点介绍RT-Thread系统中SPI BSP驱动的移植过程

移植流程

以SPI0为例

① 在board里边添加相应的外设:配置spi0外设为复位状态、设置GPIO引脚功能

② 添加相应的Kconfig开关,用以指示相应的外设开启与关闭(本质是通过宏定义或者条件编译的方式)

③ 根据SDK_2_14_2_FRDM-MCXA153提供的spi示例工程编写spi总线驱动,需要实现几个关键的函数

  • rt_hw_spi_init
  • spi_configure
  • spixfer

④ 添加相应的库文件依赖:fsl_lpspi.c、fsl_lpspi_edma.c

引脚对应关系

序号GPIOfunction
1P1_3CS
2P1_1SCLK
3P1_2MISO
4P1_0MOSI

驱动文件

board.c

rt_hw_board_init函数里加入以下代码

edma_config_t userConfig = {0};
EDMA_GetDefaultConfig(&userConfig);
EDMA_Init(DMA0, &userConfig);

pin_mux.c

BOARD_InitPins函数里加入以下代码

#ifdef BSP_USING_SPI0RESET_ReleasePeripheralReset(kLPSPI0_RST_SHIFT_RSTn);const port_pin_config_t port1_0_pin56_config = {/* Internal pull-up/down resistor is disabled */kPORT_PullDisable,/* Low internal pull resistor value is selected. */kPORT_LowPullResistor,/* Fast slew rate is configured */kPORT_FastSlewRate,/* Passive input filter is disabled */kPORT_PassiveFilterDisable,/* Open drain output is disabled */kPORT_OpenDrainDisable,/* Low drive strength is configured */kPORT_LowDriveStrength,/* Normal drive strength is configured */kPORT_NormalDriveStrength,/* Pin is configured as LPSPI0_SDO */kPORT_MuxAlt2,/* Digital input enabled */kPORT_InputBufferEnable,/* Digital input is not inverted */kPORT_InputNormal,/* Pin Control Register fields [15:0] are not locked */kPORT_UnlockRegister};/* PORT1_0 (pin 56) is configured as LPSPI0_SDO */PORT_SetPinConfig(PORT1, 0U, &port1_0_pin56_config);const port_pin_config_t port1_1_pin57_config = {/* Internal pull-up/down resistor is disabled */kPORT_PullDisable,/* Low internal pull resistor value is selected. */kPORT_LowPullResistor,/* Fast slew rate is configured */kPORT_FastSlewRate,/* Passive input filter is disabled */kPORT_PassiveFilterDisable,/* Open drain output is disabled */kPORT_OpenDrainDisable,/* Low drive strength is configured */kPORT_LowDriveStrength,/* Normal drive strength is configured */kPORT_NormalDriveStrength,/* Pin is configured as LPSPI0_SCK */kPORT_MuxAlt2,/* Digital input enabled */kPORT_InputBufferEnable,/* Digital input is not inverted */kPORT_InputNormal,/* Pin Control Register fields [15:0] are not locked */kPORT_UnlockRegister};/* PORT1_1 (pin 57) is configured as LPSPI0_SCK */PORT_SetPinConfig(PORT1, 1U, &port1_1_pin57_config);const port_pin_config_t port1_2_pin58_config = {/* Internal pull-up/down resistor is disabled */kPORT_PullDisable,/* Low internal pull resistor value is selected. */kPORT_LowPullResistor,/* Fast slew rate is configured */kPORT_FastSlewRate,/* Passive input filter is disabled */kPORT_PassiveFilterDisable,/* Open drain output is disabled */kPORT_OpenDrainDisable,/* Low drive strength is configured */kPORT_LowDriveStrength,/* Normal drive strength is configured */kPORT_NormalDriveStrength,/* Pin is configured as LPSPI0_SDI */kPORT_MuxAlt2,/* Digital input enabled */kPORT_InputBufferEnable,/* Digital input is not inverted */kPORT_InputNormal,/* Pin Control Register fields [15:0] are not locked */kPORT_UnlockRegister};/* PORT1_2 (pin 58) is configured as LPSPI0_SDI */PORT_SetPinConfig(PORT1, 2U, &port1_2_pin58_config);const port_pin_config_t port1_3_pin59_config = {/* Internal pull-up/down resistor is disabled */kPORT_PullDisable,/* Low internal pull resistor value is selected. */kPORT_LowPullResistor,/* Fast slew rate is configured */kPORT_FastSlewRate,/* Passive input filter is disabled */kPORT_PassiveFilterDisable,/* Open drain output is disabled */kPORT_OpenDrainDisable,/* Low drive strength is configured */kPORT_LowDriveStrength,/* Normal drive strength is configured */kPORT_NormalDriveStrength,/* Pin is configured as LPSPI0_PCS0 */kPORT_MuxAlt2,/* Digital input enabled */kPORT_InputBufferEnable,/* Digital input is not inverted */kPORT_InputNormal,/* Pin Control Register fields [15:0] are not locked */kPORT_UnlockRegister};/* PORT1_3 (pin 59) is configured as LPSPI0_PCS0 */PORT_SetPinConfig(PORT1, 3U, &port1_3_pin59_config);
#endif

board/Kconfig

加入SPI0相关配置

menuconfig BSP_USING_SPIconfig BSP_USING_SPIbool "Enable SPI"select RT_USING_SPIdefault yif BSP_USING_SPIconfig BSP_USING_SPI0bool "Enable SPI0"default endif

drv_spi.c

spi驱动层修改如下

/** Copyright (c) 2006-2024, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2024-08-3      hywing       The first version for MCXA*/
#include "rtdevice.h"
#include "drv_spi.h"
#include "fsl_common.h"
#include "fsl_lpspi.h"
#include "fsl_lpspi_edma.h"#define DMA_MAX_TRANSFER_COUNT (32767)enum
{
#ifdef BSP_USING_SPI0SPI1_INDEX,
#endif
};struct lpc_spi
{struct rt_spi_bus           parent;LPSPI_Type                  *LPSPIx;clock_attach_id_t           clock_attach_id;clock_div_name_t            clock_div_name;clock_name_t                clock_name;DMA_Type                    *DMAx;uint8_t                     tx_dma_chl;uint8_t                     rx_dma_chl;edma_handle_t               dma_tx_handle;edma_handle_t               dma_rx_handle;dma_request_source_t        tx_dma_request;dma_request_source_t        rx_dma_request;lpspi_master_edma_handle_t  spi_dma_handle;rt_sem_t                    sem;char                        *name;
};static struct lpc_spi lpc_obj[] =
{
#ifdef BSP_USING_SPI0{.LPSPIx = LPSPI0,.clock_attach_id = kFRO12M_to_LPSPI0,.clock_div_name = kCLOCK_DivLPSPI0,.clock_name = kCLOCK_Fro12M,.tx_dma_request = kDma0RequestLPSPI0Tx,.rx_dma_request = kDma0RequestLPSPI0Rx,.DMAx = DMA0,.tx_dma_chl = 0,.rx_dma_chl = 1,.name = "spi0",},
#endif
};struct lpc_sw_spi_cs
{rt_uint32_t pin;
};rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, rt_uint32_t pin)
{rt_err_t ret = RT_EOK;struct rt_spi_device *spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device));struct lpc_sw_spi_cs *cs_pin = (struct lpc_sw_spi_cs *)rt_malloc(sizeof(struct lpc_sw_spi_cs));cs_pin->pin = pin;rt_pin_mode(pin, PIN_MODE_OUTPUT);rt_pin_write(pin, PIN_HIGH);ret = rt_spi_bus_attach_device(spi_device, device_name, bus_name, (void *)cs_pin);return ret;
}static rt_err_t spi_configure(struct rt_spi_device *device, struct rt_spi_configuration *cfg)
{rt_err_t ret = RT_EOK;
//    struct lpc_spi *spi = RT_NULL;
//    spi = (struct lpc_spi *)(device->bus->parent.user_data);
//    ret = lpc_spi_init(spi->SPIx, cfg);return ret;
}static void LPSPI_MasterUserCallback(LPSPI_Type *base, lpspi_master_edma_handle_t *handle, status_t status, void *userData)
{struct lpc_spi *spi = (struct lpc_spi *)userData;rt_sem_release(spi->sem);}static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_message *message)
{int i;lpspi_transfer_t transfer = {0};RT_ASSERT(device != RT_NULL);RT_ASSERT(device->bus != RT_NULL);RT_ASSERT(device->bus->parent.user_data != RT_NULL);struct lpc_spi *spi = (struct lpc_spi *)(device->bus->parent.user_data);struct lpc_sw_spi_cs *cs = device->parent.user_data;if (message->cs_take){rt_pin_write(cs->pin, PIN_LOW);}transfer.dataSize = message->length;transfer.rxData   = (uint8_t *)(message->recv_buf);transfer.txData   = (uint8_t *)(message->send_buf);//  if(message->length < MAX_DMA_TRANSFER_SIZE)if (0){LPSPI_MasterTransferBlocking(spi->LPSPIx, &transfer);}else{uint32_t block, remain;block = message->length / DMA_MAX_TRANSFER_COUNT;remain = message->length % DMA_MAX_TRANSFER_COUNT;for (i = 0; i < block; i++){transfer.dataSize = DMA_MAX_TRANSFER_COUNT;if (message->recv_buf) transfer.rxData   = (uint8_t *)(message->recv_buf + i * DMA_MAX_TRANSFER_COUNT);if (message->send_buf) transfer.txData   = (uint8_t *)(message->send_buf + i * DMA_MAX_TRANSFER_COUNT);LPSPI_MasterTransferEDMA(spi->LPSPIx, &spi->spi_dma_handle, &transfer);rt_sem_take(spi->sem, RT_WAITING_FOREVER);}if (remain){transfer.dataSize = remain;if (message->recv_buf) transfer.rxData   = (uint8_t *)(message->recv_buf + i * DMA_MAX_TRANSFER_COUNT);if (message->send_buf) transfer.txData   = (uint8_t *)(message->send_buf + i * DMA_MAX_TRANSFER_COUNT);LPSPI_MasterTransferEDMA(spi->LPSPIx, &spi->spi_dma_handle, &transfer);rt_sem_take(spi->sem, RT_WAITING_FOREVER);}}if (message->cs_release){rt_pin_write(cs->pin, PIN_HIGH);}return message->length;
}static struct rt_spi_ops lpc_spi_ops =
{.configure = spi_configure,.xfer      = spixfer
};int rt_hw_spi_init(void)
{int i;for (i = 0; i < ARRAY_SIZE(lpc_obj); i++){CLOCK_SetClockDiv(lpc_obj[i].clock_div_name, 1u);CLOCK_AttachClk(lpc_obj[i].clock_attach_id);lpc_obj[i].parent.parent.user_data = &lpc_obj[i];lpc_obj[i].sem = rt_sem_create("sem_spi", 0, RT_IPC_FLAG_FIFO);lpspi_master_config_t masterConfig;LPSPI_MasterGetDefaultConfig(&masterConfig);masterConfig.baudRate = 12 * 1000 * 1000;masterConfig.pcsToSckDelayInNanoSec        = 1000000000U / masterConfig.baudRate * 1U;masterConfig.lastSckToPcsDelayInNanoSec    = 1000000000U / masterConfig.baudRate * 1U;masterConfig.betweenTransferDelayInNanoSec = 1000000000U / masterConfig.baudRate * 1U;LPSPI_MasterInit(lpc_obj[i].LPSPIx, &masterConfig, CLOCK_GetFreq(lpc_obj[i].clock_name));EDMA_CreateHandle(&lpc_obj[i].dma_tx_handle, lpc_obj[i].DMAx, lpc_obj[i].tx_dma_chl);EDMA_CreateHandle(&lpc_obj[i].dma_rx_handle, lpc_obj[i].DMAx, lpc_obj[i].rx_dma_chl);EDMA_SetChannelMux(lpc_obj[i].DMAx, lpc_obj[i].tx_dma_chl, lpc_obj[i].tx_dma_request);EDMA_SetChannelMux(lpc_obj[i].DMAx, lpc_obj[i].rx_dma_chl, lpc_obj[i].rx_dma_request);LPSPI_MasterTransferCreateHandleEDMA(lpc_obj[i].LPSPIx, &lpc_obj[i].spi_dma_handle, LPSPI_MasterUserCallback, &lpc_obj[i], &lpc_obj[i].dma_rx_handle, &lpc_obj[i].dma_tx_handle);rt_spi_bus_register(&lpc_obj[i].parent, lpc_obj[i].name, &lpc_spi_ops);}return RT_EOK;
}
INIT_DEVICE_EXPORT(rt_hw_spi_init);

SConscript

Libraries/MCXA153/SConscript文件里边加上以下代码

if GetDepend('BSP_USING_SPI'):src += ['MCXA153/drivers/fsl_lpspi.c']src += ['MCXA153/drivers/fsl_lpspi_edma.c']

测试用例

打开menuconfig使能spi0驱动

在这里插入图片描述

短接MISO和MOSI引脚(P1_0和P1_2)进行自发自收测试

在这里插入图片描述

测试程序

#include <rtthread.h>  
#include "rtdevice.h" 
#include "drv_spi.h"#define SPI_BUS_NAME "spi0" 
#define SPI_DEV_NAME "spi00" static struct rt_spi_device *spi_device;static void spi_sample(void)  
{      rt_err_t result;      struct rt_spi_configuration cfg;    uint8_t tx_buf[] = "Hello RT-Thread!";      uint8_t rx_buf[sizeof(tx_buf)];  rt_base_t cs = 1*32+3;    rt_hw_spi_device_attach(SPI_BUS_NAME, SPI_DEV_NAME, cs);/* »ñÈ¡SPIÉ豸 */spi_device = (struct rt_spi_device *)rt_device_find(SPI_DEV_NAME);if (!spi_device){rt_kprintf("can't find %s device!\n", SPI_BUS_NAME);}/* ÅäÖÃSPIÉ豸 */cfg.data_width = 8;cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;cfg.max_hz = 12* 1000 * 1000;/* ÉèÖÃSPIÉ豸 */rt_spi_configure(spi_device, &cfg);    result = rt_spi_transfer(spi_device, tx_buf, rx_buf, sizeof(tx_buf));      if (result == sizeof(tx_buf))      {          rt_kprintf("Send: %s\n", tx_buf);          rt_kprintf("Received: %s\n", rx_buf);      }      else      {          rt_kprintf("spi transfer failed! error code: %d\n", result);      }       
}  int main(void)  
{      spi_sample();      return 0;  
}

运行结果

在这里插入图片描述

总结

  • 另外,你也可以安装MCUXpresso Config Tools v16,通过图形方式配置时钟树、GPIO复用
  • 完整的BSP驱动代码可以在RT-Thread的仓库找到
http://www.15wanjia.com/news/7951.html

相关文章:

  • 做网站沈阳本地成都短视频代运营
  • 长春建站塔山双喜西安专业网络推广公司
  • 个人站长还有什么类型的网站可以做哪家培训机构学校好
  • 企业如何全面开展品牌工程建设sem优化技巧
  • 济南手机网站定制费用淄博seo培训
  • asp做微网站设计网站开发框架
  • wordpress手机建站舆情分析报告模板
  • 如何用visual studio做网站搜索引擎营销有哪些
  • 幼儿园管理网站模板下载附近的成人电脑培训班
  • 在线代理入口西安关键词seo公司
  • 安徽建设工程信息网网北京网站建设优化
  • 做管理信息的网站营销自动化
  • 莱芜新闻联播直播杭州网站运营十年乐云seo
  • 徐州哪里做网站青岛网站优化公司
  • 建设手机行网站seo网站优化推广怎么样
  • 商会网站怎么做湖南最新消息今天
  • 建设网站需要的软硬件女教师遭网课入侵直播录屏曝光se
  • 做企业网站流程百度关键词快速优化
  • 怎样给公司做一个网站做推广网站建设需要多少钱
  • 高端的电影网站域名注册腾讯云
  • 中国建设银行徐州分行网站直接登录的网站
  • 做网站最好的公司有哪些站长之家seo信息
  • 做网站开发用哪门语言爱站网ip反域名查询
  • 浦东网站建设箱海运免费直链平台
  • 59网站一起做网店普宁直接进入网站的代码
  • 外贸新闻网站最靠谱的十大教育机构
  • 在线旅游网站建设前的调研产品推广计划方案
  • 中国哪些网站做软装it培训机构培训费用
  • 南通市住房和城乡建设局网站2023年第三波新冠9月
  • 全球最新军事动态seo技术培训茂名