你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8S单片机SPI通信问题

[复制链接]
加拿大 提问时间:2015-9-12 10:40 /
本帖最后由 加拿大 于 2015-9-12 10:51 编辑

用2片STM8S003K3单片机进行SPI通信实验:发送程序没有问题,能够发送显示(LED表示),接收通过中断接收数据,但总是没有反应(LED显示)。
我检查程序、硬件连接,还是不知道哪里出错。。。有谁知道原因,麻烦帮助一下,谢谢啦。。。
硬件连接如图:



发送程序:

  1. /* MAIN.C file
  2. *
  3. * Copyright (c) 2002-2005 STMicroelectronics
  4. */
  5. #include "stm8s.h"
  6. #include "STM8S003K3.h"
  7. #include "stm8s_bitsdefine.h"
  8. #include "stm8s_clk.h"
  9. //#include "delay.h"
  10. u8 Data[8],dataIndex=0;
  11. //void SPI_MasterInit(void);
  12. void Delay(unsigned int t);
  13. //void IO_Init(void);


  14. void  main(void)
  15. {
  16. u8 i;
  17. //CLK_CKDIVR = 0x18;    //频率设为2MHz
  18. //IO_Init();
  19. //SPI_MasterInit();

  20. for(i=0;i<8;i++)
  21. {
  22.    Data[i]=~(0x01<<i);

  23. }
  24. GPIO_Init(GPIOD, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_HIGH_SLOW);          //PD口----LED表示传输
  25. GPIO_Init(GPIOC, GPIO_PIN_5|GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_FAST);   //PC5 PC6设置推挽输出
  26. GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT);//PC7 上拉输入
  27. /*
  28.   SPI初始化:高位发送先
  29.                    波特率为主时钟1/4
  30.                    主机模式
  31.                    CPOL=0
  32.                    CPHA=0
  33.                  全双工模式
  34.                软件管理NSS
  35.               CRC校验多项式为0x07(注意不可为0x00)

  36. */
  37. SPI_Init(SPI_FIRSTBIT_MSB,
  38.           SPI_BAUDRATEPRESCALER_4,
  39.           SPI_MODE_MASTER,
  40.           SPI_CLOCKPOLARITY_LOW,
  41.           SPI_CLOCKPHASE_1EDGE,
  42.           SPI_DATADIRECTION_2LINES_FULLDUPLEX,
  43.           SPI_NSS_SOFT,
  44.           0x07);
  45.                                        
  46.         SPI_Cmd(ENABLE);//使能SPI

  47. while(1)
  48. {
  49.    if(dataIndex==8)
  50.            dataIndex=0;
  51.       GPIO_Write(GPIOD,Data[dataIndex]);//将数据显示LED上
  52.          //PD_ODR=Data[dataIndex];
  53.          //while((SPI_SR&0x02)==0);
  54.            while((SPI->SR&0x02)==0);  //判断发送缓器非空则等待
  55.      SPI_SendData(Data[dataIndex++]);//将数据写入发送缓冲器
  56.            Delay(50000);

  57. }

  58. }

  59. void Delay(unsigned int t)
  60. {
  61.   while(t--);


  62. }

  63. # ifdef USE_FULL_ASSERT
  64. void assert_failed(u8 *file,u32 line)
  65. {
  66.   while(1)
  67.   {


  68.   }

  69. }

  70. #endif
复制代码


接收程序:

  1. /* MAIN.C file
  2. *
  3. * Copyright (c) 2002-2005 STMicroelectronics
  4. */
  5. #include "stm8s.h"
  6. #include "STM8S003K3.h"
  7. #include "stm8s_bitsdefine.h"
  8. #include "stm8s_clk.h"
  9. //#include "delay.h"
  10. u8 Data[8],dataIndex=0;
  11. //void SPI_MasterInit(void);
  12. void Delay(unsigned int t);
  13. //void IO_Init(void);


  14. void  main(void)
  15. {

  16. //CLK_CKDIVR = 0x18;    //频率设为2MHz
  17. //IO_Init();
  18. //SPI_MasterInit();

  19. GPIO_Init(GPIOD, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_HIGH_SLOW);
  20. GPIO_Init(GPIOC, GPIO_PIN_5|GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT);//PC5 PC6 设置上拉输入
  21. GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_OUT_PP_HIGH_FAST); //PC7 推挽输出
  22. /*
  23.   SPI初始化:高位发送先
  24.                    波特率为主时钟1/4
  25.                     从机模式
  26.                     CPOL=0
  27.                     CPHA=0
  28.                     全双工模式
  29.                      软件管理NSS
  30.                     CRC校验多项式为0x07(注意不可为0x00)

  31. */
  32. SPI_Init(SPI_FIRSTBIT_MSB,
  33.           SPI_BAUDRATEPRESCALER_4,
  34.          SPI_MODE_SLAVE,  
  35.          SPI_CLOCKPOLARITY_LOW,
  36.          SPI_CLOCKPHASE_1EDGE,
  37.          SPI_DATADIRECTION_2LINES_FULLDUPLEX,
  38.          SPI_NSS_SOFT,
  39.          0x07);
  40.                                        
  41.         SPI_ITConfig(SPI_IT_RXNE, ENABLE);//开接收缓冲器非空中断
  42.         SPI_Cmd(ENABLE); //使能SPI
  43.   _asm("rim");  //开启总中断
  44.         //rim();
  45.         
  46. while(1)
  47. {
  48.   
  49. }

  50. }

  51. # ifdef USE_FULL_ASSERT
  52. void assert_failed(u8 * file,u32 line)
  53. {
  54.   while(1)
  55.   {


  56.   }

  57. }

  58. #endif
复制代码
STM8s.it.C程序如下

  1. #include "stm8s_it.h"
  2. extern u8 Data[8],dataIndex;
  3. INTERRUPT_HANDLER(SPI_IRQHandler, 10)
  4. {
  5.   /* In order to detect unexpected events during development,
  6.      it is recommended to set a breakpoint on the following instruction.
  7.   */
  8.         if((SPI->SR&0x01)!=0) //判断接收器缓冲器非空标志位RXNE是否为1
  9.   {
  10.                 if(dataIndex==8)
  11.                 dataIndex=0;
  12.                 Data[dataIndex]=SPI->DR;  //读取接收到数据
  13.                
  14.                 GPIOD->ODR=Data[dataIndex++];  //用LED显示数据
  15.   }
  16. }
复制代码


SPI

SPI
收藏 评论2 发布时间:2015-9-12 10:40

举报

2个回答
加拿大 回答时间:2015-9-12 10:45:58
自己先顶一下。。
懂事儿 回答时间:2016-3-16 10:34:23
??
数据线应该交差连接的吧!
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版