[STM32] 关于stm32跟51的spi双机通讯

[复制链接]
1853|5
 楼主| 15383646831 发表于 2018-4-19 10:21 | 显示全部楼层 |阅读模式
最近在学stm32的spi通讯 主机是stm32接收数据  用从机89c51给32发送数据, 但是感觉从机51的spi很迷茫 希望浪费大神们一点时间解救一下  感觉问题出现在从机51的发送数据上
给批评指正
  1. 主机


  2. void SPI2_Init(void)
  3. {
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.   SPI_InitTypeDef  SPI_InitStructure;

  6.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能
  7.         RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能        

  8.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  9.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出
  10.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

  12.         GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉

  13.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
  14.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
  15.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构
  16.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //串行同步时钟的空闲状态为高电平
  17.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
  18.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
  19.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为256
  20.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
  21.         SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
  22.         SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

  23.         SPI_Cmd(SPI2, ENABLE); //使能SPI外设
  24.        
  25.         SPI2_ReadWriteByte(0xff);//启动传输                 


  26. }   
  27. //SPI 速度设置函数
  28. //SpeedSet:
  29. //SPI_BaudRatePrescaler_2   2分频   
  30. //SPI_BaudRatePrescaler_8   8分频   
  31. //SPI_BaudRatePrescaler_16  16分频  
  32. //SPI_BaudRatePrescaler_256 256分频
  33.   
  34. void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
  35. {
  36.   assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
  37.         SPI2->CR1&=0XFFC7;
  38.         SPI2->CR1|=SPI_BaudRatePrescaler;        //设置SPI2速度
  39.         SPI_Cmd(SPI2,ENABLE);

  40. }

  41. //SPIx 读写一个字节
  42. //TxData:要写入的字节
  43. //返回值:读取到的字节
  44. u8 SPI2_ReadWriteByte(u8 TxData)
  45. {               
  46.         u8 retry=0;                                        
  47.         while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
  48.                 {
  49.                 retry++;
  50.                 if(retry>200)return 0;
  51.                 }                          
  52.         SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
  53.         retry=0;

  54.         while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
  55.                 {
  56.                 retry++;
  57.                 if(retry>200)return 0;
  58.                 }                                                              
  59.         return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据                                            
  60. }

  61. #include "led.h"
  62. #include "delay.h"
  63. #include "sys.h"
  64. #include "lcd.h"
  65. #include "usart.h"       
  66. #include "spi.h"

  67. int main(void)
  68. {         
  69.        
  70.         GPIO_ResetBits(GPIOB,GPIO_Pin_12); //拉低片选
  71.         delay_init();                     //延时函数初始化          
  72.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  73.         uart_init(115200);                 //串口初始化为115200
  74.         LED_Init();                                  //初始化与LED连接的硬件接口
  75.         LCD_Init();                                   //初始化LCD        
  76.   SPI2_Init();
  77.        
  78.   
  79.         POINT_COLOR=RED;//设置字体为红色
  80.         LCD_ShowString(30,50,200,16,16,"SPI2_ReadWriteByte(0x00)");       
  81.   
  82. }

  1. 89c51从机
  2. #include <reg51.h>

  3. typedef unsigned char u8;
  4. typedef unsigned int u16;

  5. sbit SCLK=P1^0;
  6. sbit MOSI=P1^1;
  7. sbit MISO=P1^2;
  8. sbit SS=P1^3;

  9. u8 i;
  10. u8 temp;

  11. void main()
  12. {         

  13.   temp=0x01;
  14.     while(SS==0)
  15.         {
  16.            for(i=0;i<8;i++)
  17.            {
  18.             
  19.            while(!SCLK)         //等待下降沿
  20.            {
  21.            if(temp&0x80)
  22.              MISO=1;
  23.            else
  24.                   MISO=0;          
  25.            temp=temp>>1;
  26.            }
  27.           while(!SCLK);
  28.            
  29.        
  30.             }

  31.   }
  32. }
 楼主| 15383646831 发表于 2018-4-19 10:23 | 显示全部楼层
还有主机对lcd传送的数据上出现了问题,
 楼主| 15383646831 发表于 2018-4-19 10:24 | 显示全部楼层
32 真的感觉学的很水。。。
 楼主| 15383646831 发表于 2018-4-19 10:26 | 显示全部楼层
或者大神们可以给我分享一个例程看看 !!!!!!!!!!!!!!!
ningling_21 发表于 2018-4-19 10:55 | 显示全部楼层
15383646831 发表于 2018-4-19 10:26
或者大神们可以给我分享一个例程看看 !!!!!!!!!!!!!!!

用野火的例程或原子的例程都可以
m564522634 发表于 2018-4-20 16:25 | 显示全部楼层
15383646831 发表于 2018-4-19 10:23
还有主机对lcd传送的数据上出现了问题,

SPI 通信一般不会用到双机通信中去, 双机通信要做也可以,因为SPI 是同步发送数据 的, 从机想给主机发送数据是要 主机给从机 SCK 信号 ,这个就比较麻烦了 所以你要C51发信息给主机 就要主机给SCK 了,当然你要解决主机怎么知道从机给他发信息了。 你可以玩下实际用处不是很大了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

22

帖子

0

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