[资料下载] SWM181系列SPI通信的基本操作

[复制链接]
 楼主| LOVEEVER 发表于 2023-8-28 22:00 | 显示全部楼层 |阅读模式
  1. #include "SWM181.h"

  2. void SerialInit(void);
  3. void SPI0MstInit(void);
  4. void SPI1MstInit(void);

  5. int main(void)
  6. {       
  7.         uint32_t i;
  8.         uint32_t rxdata, txdata = 0x23;
  9.        
  10.         SystemInit();
  11.        
  12.         SerialInit();
  13.        
  14.         SPI0MstInit();
  15.         SPI1MstInit();
  16.        
  17.         while(1==1)
  18.         {
  19.                 rxdata = SPI_ReadWrite(SPI1, txdata);        // MOSI 连接到 MISO
  20.                 txdata = rxdata + 1;
  21.                
  22.                 printf("rxdata: %d\r\n", rxdata);
  23.                
  24.                 for(i = 0; i < SystemCoreClock/16; i++);
  25.         }
  26. }


  27. void SPI0MstInit(void)
  28. {
  29.         SPI_InitStructure SPI_initStruct;
  30.        
  31.         PORT_Init(PORTA, PIN12, PORTA_PIN12_SPI0_SSEL, 0);
  32.         PORT_Init(PORTA, PIN13, PORTA_PIN13_SPI0_MISO, 1);
  33.         PORT_Init(PORTA, PIN14, PORTA_PIN14_SPI0_MOSI, 0);
  34.         PORT_Init(PORTA, PIN15, PORTA_PIN15_SPI0_SCLK, 0);
  35.        
  36.         SPI_initStruct.clkDiv = SPI_CLKDIV_32;
  37.         SPI_initStruct.FrameFormat = SPI_FORMAT_SPI;
  38.         SPI_initStruct.SampleEdge = SPI_SECOND_EDGE;
  39.         SPI_initStruct.IdleLevel = SPI_HIGH_LEVEL;
  40.         SPI_initStruct.WordSize = 8;
  41.         SPI_initStruct.Master = 1;
  42.         SPI_initStruct.RXHFullIEn = 0;
  43.         SPI_initStruct.TXEmptyIEn = 0;
  44.         SPI_initStruct.TXCompleteIEn = 0;
  45.         SPI_Init(SPI0, &SPI_initStruct);
  46.        
  47.         SPI_Open(SPI0);
  48. }

  49. void SPI1MstInit(void)
  50. {
  51.         SPI_InitStructure SPI_initStruct;
  52.        
  53.         PORT_Init(PORTC, PIN4, PORTC_PIN4_SPI1_SSEL, 0);
  54.         PORT_Init(PORTC, PIN5, PORTC_PIN5_SPI1_MISO, 1);
  55.         PORT_Init(PORTC, PIN6, PORTC_PIN6_SPI1_MOSI, 0);
  56.         PORT_Init(PORTC, PIN7, PORTC_PIN7_SPI1_SCLK, 0);
  57.        
  58.         SPI_initStruct.clkDiv = SPI_CLKDIV_32;
  59.         SPI_initStruct.FrameFormat = SPI_FORMAT_SPI;
  60.         SPI_initStruct.SampleEdge = SPI_SECOND_EDGE;
  61.         SPI_initStruct.IdleLevel = SPI_HIGH_LEVEL;
  62.         SPI_initStruct.WordSize = 8;
  63.         SPI_initStruct.Master = 1;
  64.         SPI_initStruct.RXHFullIEn = 0;
  65.         SPI_initStruct.TXEmptyIEn = 0;
  66.         SPI_initStruct.TXCompleteIEn = 0;
  67.         SPI_Init(SPI1, &SPI_initStruct);
  68.        
  69.         SPI_Open(SPI1);
  70. }


  71. void SerialInit(void)
  72. {
  73.         UART_InitStructure UART_initStruct;
  74.        
  75.         PORT_Init(PORTA, PIN0, FUNMUX_UART0_RXD, 1);        //GPIOA.0配置为UART0输入引脚
  76.         PORT_Init(PORTA, PIN1, FUNMUX_UART0_TXD, 0);        //GPIOA.1配置为UART0输出引脚
  77.        
  78.         UART_initStruct.Baudrate = 57600;
  79.         UART_initStruct.DataBits = UART_DATA_8BIT;
  80.         UART_initStruct.Parity = UART_PARITY_NONE;
  81.         UART_initStruct.StopBits = UART_STOP_1BIT;
  82.         UART_initStruct.RXThresholdIEn = 0;
  83.         UART_initStruct.TXThresholdIEn = 0;
  84.         UART_initStruct.TimeoutIEn = 0;
  85.         UART_Init(UART0, &UART_initStruct);
  86.         UART_Open(UART0);
  87. }

  88. /******************************************************************************************************************************************
  89. * 函数名称: fputc()
  90. * 功能说明: printf()使用此函数完成实际的串口打印动作
  91. * 输    入: int ch                要打印的字符
  92. *                        FILE *f                文件句柄
  93. * 输    出: 无
  94. * 注意事项: 无
  95. ******************************************************************************************************************************************/
  96. int fputc(int ch, FILE *f)
  97. {
  98.         UART_WriteByte(UART0, ch);
  99.        
  100.         while(UART_IsTXBusy(UART0));
  101.        
  102.         return ch;
  103. }


lium 发表于 2023-8-29 19:36 | 显示全部楼层
基本操作了这个是
pixhw 发表于 2023-9-5 11:32 | 显示全部楼层
SPI通信的基本操作步骤如下:

主机输出时钟信号。
主机将SS/CS引脚切换到低电平状态,来激活从机。
主机沿MOSI线路一次一位地将数据发送到从站,从机读取接收到的位。
如果需要响应,从机沿MISO线一次一位地将数据返回给主机。
mattlincoln 发表于 2023-9-5 11:50 | 显示全部楼层
SPI通信具有简单、高效、双向、同步等特点,常用于连接各种外设
averyleigh 发表于 2023-9-5 12:17 | 显示全部楼层
SPI通信中的时序关系非常重要,需要按照正确的时序进行数据传输。在实际应用中,SPI通信还需要考虑上下文的处理、异常处理等问题
fengm 发表于 2023-9-5 12:50 | 显示全部楼层
要确保成功的SPI通信,需要了解主设备和从设备之间的通信协议和参数,并进行正确的初始化和配置。
mattlincoln 发表于 2023-9-5 13:02 | 显示全部楼层
在SPI通信中,当发送数据完成、接收数据完成或者两者同时完成时,通信过程就结束。此时,需要对SPI总线进行复位,以便下一次通信。
averyleigh 发表于 2023-9-5 13:24 | 显示全部楼层
SPI通信的效率还受到硬件、驱动程序等因素的影响,需要根据具体情况进行优化。
sdlls 发表于 2023-9-5 13:39 | 显示全部楼层
通过SPI进行数据交换。将要发送的数据写入SPI发送缓冲区,等待数据传输完成后,从SPI接收缓冲区读取接收到的数据。根据所选的数据格式和传输顺序,进行适当的读写操作。
adolphcocker 发表于 2023-9-5 13:57 | 显示全部楼层
连接SPI主设备(如微控制器)和从设备之间的引脚。通常,SPI使用四根线来传输数据:SCK(时钟线),MOSI(主设备输出,从设备输入),MISO(主设备输入,从设备输出),以及一个可选的SS(片选)线。确保正确地连接这些引脚。
beacherblack 发表于 2023-9-5 14:19 | 显示全部楼层
在完成数据交换后,关闭SPI通信。可以禁用SPI模块、释放片选线,或者执行其他必要的清理操作。
linfelix 发表于 2023-9-5 14:28 | 显示全部楼层
主设备发送信号:主设备通过将CS/SS(芯片选择/片选)拉低,选择要通信的从设备,并启动通信。
时钟信号:主设备通过发送时钟信号,告诉从设备进行写数据或读数据操作。时钟信号的上升沿或下降沿可能会被用来作为读写时机的标志。
发送数据:主设备将要发送的数据写入发送数据缓存区(Memory),该缓存区经过移位寄存器,通过MOSI(主出从入)信号线将数据一位一位地传送给从设备。
接收数据:从设备通过MISO(从入主出)信号线将接收到的数据一位一位地传送给主设备。
lzbf 发表于 2023-9-5 14:36 | 显示全部楼层
SPI通信是一种常用的串行外设接口,可以用于实现多种外设的连接和通信,例如SD卡、FATFS、NAND Flash、EEPROM等。
sesefadou 发表于 2023-9-5 14:44 | 显示全部楼层
在开始进行数据交换之前,确保将SPI模块初始化并启动。这可能涉及到配置SPI控制寄存器、使能SPI模块、设置时钟等操作。
jonas222 发表于 2023-9-5 14:59 | 显示全部楼层
数据传输:

主设备将要传输的数据按照字节的顺序发送到从设备。
数据是串行传输的,通常是8位数据的块。
数据接收:

从设备接收数据,并在合适的时机响应主设备。
数据的接收和处理方式取决于具体的SPI设备和通信协议。
应答信号:

从设备通常会发送一个应答信号来确认接收到数据,或者在需要时发送其他状态信息。
通信结束:

当所有数据传输完成后,主设备将片选信号(CS)拉高,表示通信结束。
macpherson 发表于 2023-9-5 15:36 | 显示全部楼层
在SPI通信中,发送数据需要通过SPI总线进行。发送数据的过程包括:准备发送数据、发送数据、发送完成等步骤。
hearstnorman323 发表于 2023-9-5 16:04 | 显示全部楼层
SPI可以以全双工或半双工模式进行数据传输。在全双工模式下,主设备和从设备可以同时发送和接收数据。在半双工模式下,数据只能在一个方向上传输。确定所需的数据传输顺序,并进行相应的配置。
vivilyly 发表于 2023-9-5 16:26 | 显示全部楼层
SPI通信是一种高速、全双工、同步通信协议,允许主设备和多个从设备之间进行数据传输。
cashrwood 发表于 2023-9-5 16:53 | 显示全部楼层
SPI通信的基本操作步骤包括初始化SPI通信、设置SPI通信的寄存器、发送数据、接收数据、关闭SPI通信等。
benjaminka 发表于 2023-9-5 17:06 | 显示全部楼层
初始化SPI通信:在进行SPI通信之前,需要先初始化SPI通信的相关参数,包括SPI的工作模式、时钟极性、数据位数、发送使能、接收使能等。这些参数可以通过编写代码来实现,也可以通过硬件配置来实现。
设置SPI通信的寄存器:在进行SPI通信之前,需要先设置SPI通信的寄存器,包括SPI控制寄存器、SPI数据寄存器等。这些寄存器可以通过编写代码来实现,也可以通过硬件配置来实现。
发送数据:在进行SPI通信时,需要先将需要发送的数据写入SPI数据寄存器中,然后通过SPI控制寄存器启动SPI通信,将数据发送到外设中。
接收数据:在进行SPI通信时,外设会将接收到的数据写入SPI数据寄存器中,因此在SPI通信结束后,可以从SPI数据寄存器中读取接收到的数据。
关闭SPI通信:在完成SPI通信后,需要关闭SPI通信,包括关闭SPI控制寄存器中的发送使能和接收使能,以及关闭SPI通信的相关参数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

342

主题

2619

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部