IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【1】SPI驱动:GPIO模拟SPI和MCU自带的SPI -> 正文阅读

[嵌入式]【1】SPI驱动:GPIO模拟SPI和MCU自带的SPI

项目内容:SPI驱动CMT2300A,实现数据的接收和发送

驱动芯片MCU:HC32F005

一、GPIO模拟三线SPI

1、CMT2300A的SPI接口定义:

SCLKSPI的时钟
CSBSPI访问寄存器的片选
FCSBSP访问FIFO的片选
SDIOSPI的数据输入和输出

2、MCU的GPIO口模拟3线SPI

使用MCU的SPI来驱动CMT2300A,使得CMT2300A完成数据的接收和发送;

MCU和CMT2300A之间的通讯是通过3线SPI接口进行的。

MCU的引脚配置原理图:

?(1)第一步:配置MCU的3线SPI

    GpioInitStruct.enDrv = GpioDrvH;  //端口驱动能力:GPIO高驱动能力
    GpioInitStruct.enDir = GpioDirOut; //GPIO:输出

    Gpio_Init(EVB_SPI_MOSI_PORT, EVB_SPI_MOSI_PIN, &GpioInitStruct);
    Gpio_SetAfMode(EVB_SPI_MOSI_PORT, EVB_SPI_MOSI_PIN, GpioAf0);    //SPI_SDIO 24

    Gpio_Init(EVB_SPI_CS_PORT, EVB_SPI_CS_PIN,&GpioInitStruct);
    Gpio_SetAfMode(EVB_SPI_CS_PORT, EVB_SPI_CS_PIN,GpioAf0);         //SPI_CS 14

    Gpio_Init(EVB_SPI_SCK_PORT, EVB_SPI_SCK_PIN,&GpioInitStruct);
    Gpio_SetAfMode(EVB_SPI_SCK_PORT, EVB_SPI_SCK_PIN,GpioAf0);       //SPI_SCK  15
	
    Gpio_Init(GpioPort3, GpioPin3, &GpioInitStruct);
    Gpio_SetAfMode(GpioPort3, GpioPin3, GpioAf0);        			 //SPI_FCSB 33

?(2)第二步:实现SPI写寄存器的功能

? ? ? ? SPI写寄存器时序原理图如下:

?

??SPI写寄存器__实现的代码:

void cmt_spi3_write(u8 addr, u8 dat)
{
		cmt_spi3_sdio_1();   
		cmt_spi3_sdio_out(); //MCU_sdio_P24 设置为输出

		cmt_spi3_sclk_0();   //时钟拉低
		cmt_spi3_sclk_0();   

		cmt_spi3_fcsb_1();   //FSCB拉高,写FIFO时才拉低
		cmt_spi3_fcsb_1();
		cmt_spi3_csb_0();  //寄存器片选拉低

		/* > 延迟0.5 SCLK cycle才开始进入第一个数据 */
		cmt_spi3_delay(); 
		cmt_spi3_delay();

		/* r/w = 0 写寄存器的标志*/
		cmt_spi3_send(addr&0x7F);	//发送寄存器地址		
		cmt_spi3_send(dat);  //发送数据

		cmt_spi3_sclk_0(); //写完数据之后时钟至少拉低0.5个周期延时,才能把CSB拉高

		/* > 0.5 SCLK cycle */
		cmt_spi3_delay();
		cmt_spi3_delay();

		cmt_spi3_csb_1();//寄存器片选拉高
		
		cmt_spi3_sdio_1();
		cmt_spi3_sdio_in(); //gpio_sdio发送输出状态完成后变成输入状态
		
		cmt_spi3_fcsb_1(); //FIFO片选拉高  
}

(3)实现SPI写FIFO的功能

????????FIFO用来在CMT2300_Rx中存储接收到的数据,在CMT2300_Tx中存储即将发送的数据,FIFO可以通过SPI接口读取。

SPI写FIFO的时序图:

MCU生成一组数组,p_buf[i]=i,length=128,

CMT2300_FIFO中写入即将发送的数据,然后2300进入GO_TX状态,把数据发送出去;

??SPI写FIFO__实现的代码:

//给FIFO中要写的数:p_buf[i] = [1,128],这组数由MCU生成
void cmt_spi3_write_fifo(const u8* p_buf, u16 len)
{
    u16 i;
    cmt_spi3_fcsb_1();
    cmt_spi3_fcsb_1();
    cmt_spi3_csb_1();
    cmt_spi3_csb_1();
    cmt_spi3_sclk_0();
    cmt_spi3_sclk_0();
    cmt_spi3_sdio_out(); //sdio_输出:MCU的数组g_txBuffer[i]写入到2300_FIFO中
    for(i=0; i<len; i++) //Buffer的长度:128
    {
        cmt_spi3_fcsb_0(); //FIFO片选,FCSB低有效,且延时1个SCLK长度
        /* > 1 SCLK cycle */
        cmt_spi3_delay();
        cmt_spi3_delay();//延时1个SCLK时钟周期后,才开始发数
        cmt_spi3_send(p_buf[i]);//把p_buf[]中的数写入FIFO,再由2300发送出去
        cmt_spi3_sclk_0();//拉低,延迟2s,才能再拉高
		CMT2300A_DelayUs(3); /* > 2 us */
        cmt_spi3_fcsb_1();//拉高,延迟4s才能再拉低
        /* > 4 us */
		    CMT2300A_DelayUs(4);
    }
    cmt_spi3_sdio_in();   //写完数据,状态由输出变为输入
    cmt_spi3_fcsb_1();
}

二、MCU自带的4线SPI

1、MCU的SPI接口定义

CMT2300AMCUgpio复用功能
SCLKgpio_p155
CSBgpio_p145
FCSBgpio_p330
SPI_MOSIgpio_p245
SPI_MISOgpio_p235

2、使用MCU的4线SPI驱动CMT2300A

(1) 配置MCU的GPIO端口,复用SPI接口功能:

    GpioInitStruct.enDrv = GpioDrvH;  //端口驱动能力:GPIO高驱动能力
    GpioInitStruct.enDir = GpioDirOut; //GPIO:输出

    Gpio_Init(EVB_SPI_MOSI_PORT, EVB_SPI_MOSI_PIN, &GpioInitStruct);
    Gpio_SetAfMode(EVB_SPI_MOSI_PORT, EVB_SPI_MOSI_PIN, GpioAf5);    //SPI_MOSI 24

    Gpio_Init(EVB_SPI_CS_PORT, EVB_SPI_CS_PIN,&GpioInitStruct);
    Gpio_SetAfMode(EVB_SPI_CS_PORT, EVB_SPI_CS_PIN,GpioAf5);         //SPI_CS 14

    Gpio_Init(EVB_SPI_SCK_PORT, EVB_SPI_SCK_PIN,&GpioInitStruct);
    Gpio_SetAfMode(EVB_SPI_SCK_PORT, EVB_SPI_SCK_PIN,GpioAf5);       //SPI_SCK  15
	
    Gpio_Init(GpioPort3, GpioPin3, &GpioInitStruct);
    Gpio_SetAfMode(GpioPort3, GpioPin3, GpioAf0);        			 //SPI_FCSB 33

    GpioInitStruct.enDir = GpioDirIn;
    Gpio_Init(EVB_SPI_MISO_PORT, EVB_SPI_MISO_PIN,&GpioInitStruct);
    Gpio_SetAfMode(EVB_SPI_MISO_PORT, EVB_SPI_MISO_PIN,GpioAf5);     //SPI_MISO 23

(2)实现SPI读寄存器功能:

? ? ? ? SPI读寄存器的时序图如下:

? ????????SPI读寄存器的代码:

//SPI读寄存器:根据寄存器地址,获取数据
void cmt_spi3_read(u8 addr, u8* p_dat)
{
    Spi_SetCS(M0P_SPI, FALSE); //SPI配置主发送的电平,低电平有效
    cmt_spi3_send(addr|0x80);  //SPI发送一个字节的数据,发送要读的寄存器的地址
    *p_dat = cmt_spi3_recv();  //得到想要的数据,存取p_dat 
    Spi_SetCS(M0P_SPI, TRUE);  //电平置高
}

(3)实现SPI读FIFO的功能

SPI读FIFO的时序图:

void cmt_spi3_read_fifo(u8* p_buf, u16 len)
{
    u16 i;
    for(i=0; i<len; i++)
    {
        Spi_SetFCS(FALSE); //SPI读FIFO片选有效  
        p_buf[i] = cmt_spi3_recv(); //把接收到的数保存到p_buf[]中
        Spi_SetFCS(TRUE);  //读完数据,片选置高 
        cmt_spi3_delay();
        cmt_spi3_delay();		
    }
}

参考:

1.CMT2300A官方使用手册《CMT2300A-CN-Rev0.7》

2.CMT2300A官方例程《CMT2300A_Demo(STM32)V1.0.1》

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:55:20  更:2022-04-26 11:56:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:20:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码