Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4242344
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: 嵌入式

2011-06-27 18:35:39

工程代码: 9spi双工主机向从机发送数据.rar  

        附件二: 和上面的代码一样,只是可以 单独设置 SPI1 主机/从机模式, SPI2 主机/从机模式
                 上面那个附件,只能一起设置 SPI1 SPI2 模式
                        9_1spi双工主机向从机发送数据.rar  

修改附件三:   对spi.h .c 文件 进行修改,主从配置 使用 SPIy 主机 SPIz从机
                9_spi双工通信修改3.rar  


可以参考: StdLib3.5 库函数 spi 全双工 code

说明:
     stm32中 SPI1 设置为 主模式
             SPI2 设置为 从模式

     主机 向 从机 发送数据, 从机接收数据,验证主机发送数据的正确性
     从机 向 主机 发送数据, 主机接收书记,验证从机发送数据的正确性
出现了错误:
     从机 向 主机 发送数据,但是主机不能接收到正确的数据
分析:
     由于 板子上得 SPI1 接到了SD卡模块,相关的管教接到3.3v上,被拉高了,导致 主机接收到的数据被影响,所以不能接收到正确的数据。
     板子上得硬件不能修改了,所以以后 可以用其他板子 验证 正确性了。






注意: SPI1 这里被拉高了,导致 从机向主机 发送数据,主机不能正确接收数据了







  1. * 修改Date:2011.6.27 15:40
  2.               spi功能 设置全双工
  3.              STM32内部 SPI1 设为主设备
  4.              SPI2 设为从设备
  5.              主机向从机发送数据, 从机接收数据 成功
  6.              从机向主机发送数据,失败,需要解决
  7.             
  8.     从机向主机发送失败原因:
  9.      由于主机SPI1 接到了SD卡模块,SPI 4个管教拉高了,导致
  10.              从 从机向主机发送数据, 被干扰了。
  11.     
  12.              下次有 2片 stm再次测试
  13. */
  14. #include "stm32f10x.h"
  15. #include "rcc.h"
  16. #include "systick.h"
  17. #include "led.h"
  18. #include "delay.h"
  19. #include "key.h"
  20. #include "tim3.h"
  21. #include "usart1.h"
  22. #include "spi.h"

  23. u8 Sreceiv = 0;    //从设备接收数据
  24. u8 Mreceiv = 0;    //主设备接收数据
  25. int main()
  26. {    
  27.     RCC_Configuration();
  28.     delay_init();
  29.     LED_Init();
  30.     USART1_GPIO_Configuration();
  31.     USART1_Configuration();    
  32. //    SPI_GPIO_Configuration(SPI_Mode_Master, SPI_Mode_Slave);//设置SPI1 主模式 SPI2从模式
  33.   SPI1_GPIO_Configuration(SPI_Mode_Master); //单独设置SPI1 主机模式
        SPI2_GPIO_Configuration(SPI_Mode_Slave);//单独设置 SPI2 从机模式
  34.    SPI_Configuration();
  35.      
  36.     delay_s(2);//usart 发送显示开始
  37.     usart1_sendchar(65);//A字符 asicc码65

  38.     Master_SPI_Write_Byte(SPI1, 55); //主机发送 数据 55
  39.     Sreceiv = Slave_SPI_Read_Byte(SPI2);//从机接收数据
  40.     if(Sreceiv == 55) //接收正确,打印信息,接收不正确,不打印信息
  41.         usart1_sendchar(68); //D字符 asicc码68

  42. /*主机SPI1 接到SD卡模块,被拉高,导致接收从机数据失败*/    
  43.     Slave_SPI_Write_Byte(SPI2, 66);//从机发送 数据66
  44.     Mreceiv = Master_SPI_Read_Byte(SPI1); //主机接收数据
  45.     if(Mreceiv == 66) //接收正确,打印信息,接收不正确,不打印信息
  46.         usart1_sendchar(69); //E字符 asicc码68


  47.     while(1)
  48.     {
  49.         usart1_sendchar(64); //@字符 asicc码64        
  50.         delay_s(1);
  51.     }
  52.     return 0;
  53. }

  1. #ifndef __SPI_H
  2. #define __SPI_H

  3. #include "stm32f10x.h"

  4. #define SPIy SPI1
  5. #define SPIy_CLK RCC_APB2Periph_SPI1
  6. #define SPIy_GPIO GPIOA
  7. #define SPIy_GPIO_CLK RCC_APB2Periph_GPIOA
  8. #define SPIy_PIN_SCK GPIO_Pin_5
  9. #define SPIy_PIN_MISO GPIO_Pin_6
  10. #define SPIy_PIN_MOSI GPIO_Pin_7

  11. #define SPIz SPI2
  12. #define SPIz_CLK RCC_APB1Periph_SPI2
  13. #define SPIz_GPIO GPIOB
  14. #define SPIz_GPIO_CLK RCC_APB2Periph_GPIOB
  15. #define SPIz_PIN_SCK GPIO_Pin_13
  16. #define SPIz_PIN_MISO GPIO_Pin_14
  17. #define SPIz_PIN_MOSI GPIO_Pin_15

  18. void SPI_Configuration(void);
  19.                             // SPIy SPIz
  20. void SPI_GPIO_Configuration(uint16_t SPIy_Mode, uint16_t SPIz_Mode);

  21. //主设备 写数据到 从设备
  22. void Master_SPI_Write_Byte(SPI_TypeDef* SPIx_Master, u8 byte);
  23. //从设备 读取数据 from 主设备
  24. u8 Slave_SPI_Read_Byte(SPI_TypeDef* SPIx_Slave);
  25. //从设备 写数据到 主设备
  26. void Slave_SPI_Write_Byte(SPI_TypeDef* SPIx_Slave, u8 byte);
  27. //主设备 读取数据 from 从设备
  28. u8 Master_SPI_Read_Byte(SPI_TypeDef* SPIx_Master);


  29. #endif

  1. #include "spi.h"

//注意,如果我们 交换 主从机,需要再次配置 主从机模式,修改 SPI_Configuration
// 这个程序还没有修改
  1. void SPI_Configuration(void)
  2. {
  3.     SPI_InitTypeDef SPI_InitStructure;
  4.     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//全双工模式
  5.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//配置为主机
  6.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//8位数据帧
  7.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//时钟低时活动
  8.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//数据在第二个边沿捕获
  9.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//内部NSS信号由SSI控制
  10.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;//预分频4
  11.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;//传输的第一位是低位
  12.     SPI_InitStructure.SPI_CRCPolynomial = 7; //用于crc计算
  13.     SPI_Init(SPIy, &SPI_InitStructure);     //初始化 SPI1
  14.     
  15.     /* SPIz Config -------------------------------------------------------------*/
  16.     SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; //SPI2 设置 从机
  17.     SPI_Init(SPIz, &SPI_InitStructure);     //初始化 SPI2
  18.     
  19.     SPI_Cmd(SPIy, ENABLE); //使能 SPIy = SPI1
  20.     SPI_Cmd(SPIz, ENABLE); //使能 SIPz = SPI2
  21.   
  22.   //定义在 了 rcc中
  23.   //    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//SPI1
  24. //    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//SPI2
  25.   // RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  26. //    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
  27.       
  28. }

  29. void SPI_GPIO_Configuration(uint16_t SPIy_Mode, uint16_t SPIz_Mode)
  30. {
  31.     GPIO_InitTypeDef GPIO_InitStructure;
  32.     
  33.     /* Configure SPIy pins: SCK, MISO and MOSI ---------------------------------*/
  34.     GPIO_InitStructure.GPIO_Pin = SPIy_PIN_SCK | SPIy_PIN_MOSI;
  35.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  36.     
  37.     if(SPIy_Mode == SPI_Mode_Master)
  38.     {
  39.     /* Configure SCK and MOSI pins as Alternate Function Push Pull */
  40.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  41.     }
  42.     else
  43.     {
  44.     /* Configure SCK and MOSI pins as Input Floating */
  45.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  46.     }

  47.     GPIO_Init(SPIy_GPIO, &GPIO_InitStructure);
  48.     GPIO_InitStructure.GPIO_Pin = SPIy_PIN_MISO;
  49.     
  50.     if(SPIy_Mode == SPI_Mode_Master)
  51.     {
  52.         /* Configure MISO pin as Input Floating */
  53.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  54.     }
  55.     else
  56.     {
  57.         /* Configure MISO pin as Alternate Function Push Pull */
  58.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  59.     }
  60.         
  61.     GPIO_Init(SPIy_GPIO, &GPIO_InitStructure);
  62.     
  63.     /* Configure SPIz pins: SCK, MISO and MOSI ---------------------------------*/
  64.     GPIO_InitStructure.GPIO_Pin = SPIz_PIN_SCK | SPIz_PIN_MOSI;
  65.     
  66.     if(SPIz_Mode == SPI_Mode_Slave)
  67.     {
  68.         /* Configure SCK and MOSI pins as Input Floating */
  69.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  70.     }
  71.     else
  72.     {
  73.         /* Configure SCK and MOSI pins as Alternate Function Push Pull */
  74.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  75.     }
  76.     
  77.     GPIO_Init(SPIz_GPIO, &GPIO_InitStructure);
  78.     GPIO_InitStructure.GPIO_Pin = SPIz_PIN_MISO;
  79.     
  80.     if(SPIz_Mode == SPI_Mode_Slave)
  81.     {
  82.         /* Configure MISO pin as Alternate Function Push Pull */
  83.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  84.     }
  85.     else
  86.     {     /* Configure MISO pin as Input Floating */
  87.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  88.     }
  89.     
  90.     GPIO_Init(SPIz_GPIO, &GPIO_InitStructure);
  91. }

  92. //主设备 写数据到 从设备
  93. void Master_SPI_Write_Byte(SPI_TypeDef* SPIx_Master, u8 byte)
  94. {
  95.     while(SPI_I2S_GetFlagStatus(SPIx_Master, SPI_I2S_FLAG_TXE) == RESET);
  96.     SPI_I2S_SendData(SPIx_Master, byte);
  97. }

  98. //从设备 读取数据 from 主设备
  99. u8 Slave_SPI_Read_Byte(SPI_TypeDef* SPIx_Slave)
  100. {
  101.     while (SPI_I2S_GetFlagStatus(SPIx_Slave, SPI_I2S_FLAG_RXNE) == RESET);
  102.     return SPI_I2S_ReceiveData(SPIx_Slave);
  103. }

  104. //从设备 写数据到 主设备
  105. void Slave_SPI_Write_Byte(SPI_TypeDef* SPIx_Slave, u8 byte)
  106. {
  107.     while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
  108.     SPI_I2S_SendData(SPIx_Slave, byte);        
  109. }

  110. //主设备 读取数据 from 从设备
  111. u8 Master_SPI_Read_Byte(SPI_TypeDef* SPIx_Master)
  112. {
  113.   //写 哑元字节dumy    
  114.  // Master_SPI_Write_Byte(SPIx_Master, 0x00);
  115.   SPI_I2S_SendData(SPIx_Master, 0x00);//产生读时的clk
  116.   while(SPI_I2S_GetFlagStatus(SPIx_Master, SPI_I2S_FLAG_RXNE) == RESET);
  117.   return SPI_I2S_ReceiveData(SPIx_Master);
  118. }




阅读(2109) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~