加拿大 发表于 2015-9-12 10:40:42

STM8S单片机SPI通信问题

本帖最后由 加拿大 于 2015-9-12 10:51 编辑

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



发送程序:

/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include "stm8s.h"
#include "STM8S003K3.h"
#include "stm8s_bitsdefine.h"
#include "stm8s_clk.h"
//#include "delay.h"
u8 Data,dataIndex=0;
//void SPI_MasterInit(void);
void Delay(unsigned int t);
//void IO_Init(void);


voidmain(void)
{
u8 i;
//CLK_CKDIVR = 0x18;    //频率设为2MHz
//IO_Init();
//SPI_MasterInit();

for(i=0;i<8;i++)
{
   Data=~(0x01<<i);

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

*/
SPI_Init(SPI_FIRSTBIT_MSB,
          SPI_BAUDRATEPRESCALER_4,
          SPI_MODE_MASTER,
          SPI_CLOCKPOLARITY_LOW,
          SPI_CLOCKPHASE_1EDGE,
          SPI_DATADIRECTION_2LINES_FULLDUPLEX,
          SPI_NSS_SOFT,
          0x07);
                                       
      SPI_Cmd(ENABLE);//使能SPI

while(1)
{
   if(dataIndex==8)
         dataIndex=0;
      GPIO_Write(GPIOD,Data);//将数据显示LED上
         //PD_ODR=Data;
         //while((SPI_SR&0x02)==0);
         while((SPI->SR&0x02)==0);//判断发送缓器非空则等待
   SPI_SendData(Data);//将数据写入发送缓冲器
         Delay(50000);

}

}

void Delay(unsigned int t)
{
while(t--);


}

# ifdef USE_FULL_ASSERT
void assert_failed(u8 *file,u32 line)
{
while(1)
{


}

}

#endif


接收程序:
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include "stm8s.h"
#include "STM8S003K3.h"
#include "stm8s_bitsdefine.h"
#include "stm8s_clk.h"
//#include "delay.h"
u8 Data,dataIndex=0;
//void SPI_MasterInit(void);
void Delay(unsigned int t);
//void IO_Init(void);


voidmain(void)
{

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

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

*/
SPI_Init(SPI_FIRSTBIT_MSB,
          SPI_BAUDRATEPRESCALER_4,
         SPI_MODE_SLAVE,
         SPI_CLOCKPOLARITY_LOW,
         SPI_CLOCKPHASE_1EDGE,
         SPI_DATADIRECTION_2LINES_FULLDUPLEX,
         SPI_NSS_SOFT,
         0x07);
                                       
      SPI_ITConfig(SPI_IT_RXNE, ENABLE);//开接收缓冲器非空中断
      SPI_Cmd(ENABLE); //使能SPI
_asm("rim");//开启总中断
      //rim();
      
while(1)
{

}

}

# ifdef USE_FULL_ASSERT
void assert_failed(u8 * file,u32 line)
{
while(1)
{


}

}

#endifSTM8s.it.C程序如下
#include "stm8s_it.h"
extern u8 Data,dataIndex;
INTERRUPT_HANDLER(SPI_IRQHandler, 10)
{
/* In order to detect unexpected events during development,
   it is recommended to set a breakpoint on the following instruction.
*/
      if((SPI->SR&0x01)!=0) //判断接收器缓冲器非空标志位RXNE是否为1
{
                if(dataIndex==8)
                dataIndex=0;
                Data=SPI->DR;//读取接收到数据
               
                GPIOD->ODR=Data;//用LED显示数据
}
}

加拿大 发表于 2015-9-12 10:45:58

自己先顶一下。。

懂事儿 发表于 2016-3-16 10:34:23

??
数据线应该交差连接的吧!
页: [1]
查看完整版本: STM8S单片机SPI通信问题