打印

STM32F的SPI进入中断后出不来了

[复制链接]
2133|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhou606|  楼主 | 2011-6-3 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下:
//定时中断程序,改部分代码可以实现TIMER2~TIME4的定时中断
//void TIM2_IRQHandler(void)改成对应中断号
//RCC->APB1ENR|=1<<0;改成对应中断的使能
//TIM2->ARR;TIM2->PSC;TIM2->DIER;TIM2->CR1;改成对应结构体
//MY_NVIC_Init(1,3,TIM2_IRQChannel,2);改对应优先级
//若不想使用中断,屏蔽MY_NVIC_Init(1,3,TIM2_IRQChannel,2);
#include <stm32f10x_lib.h>
#include "sys.h"
#include "delay.h"
#define CS PBout(12)   // PB10
#define SPI_SPEED_2         0
#define SPI_SPEED_8         1
#define SPI_SPEED_16     2
#define SPI_SPEED_256   3
void SPIx_Init(void);           //初始化 SPI  口
unsigned char SPI[3];
unsigned char i;
unsigned char a;
u8 SPIx_ReadWriteByte(u8 TxData);
void SPIx_SetSpeed(u8 SpeedSet);
        //SPI 总线读写一个字节   
int main(void)
{     
   Stm32_Clock_Init(9);  //系统时钟设置
delay_init(72);    //延时初始化      
RCC->APB2ENR|=1<<3;      //使能PORTB时钟
a=0;
for(i=0;i<3;i++)
{
SPI=0x33;
}
SPIx_Init();
SPIx_SetSpeed(SPI_SPEED_2);
SPIx_ReadWriteByte(0x01);               
while(1)
{
}
}
u8 SPIx_ReadWriteByte(u8 TxData)
{

unsigned char  retry=0;
CS=0;
// while((SPI2->SR&1<<1)==0) //等待发送区空
//  {
//   retry++;
//   if(retry>200)return 0;
//  }
SPI2->DR=TxData;          //发送一个byte
while((SPI2->SR&1<<1)==0) //等待发送区空
  {
   retry++;
   if(retry>200)return 0;
  }
retry=0;
// for(i=0;i<3;i++)
// {
//// CS=0;
// while((SPI2->SR&1<<0)==1)  //等待接收完一个byte
//  {
//   retry++;
//   if(retry>200)return 0;
//  }
// //return SPI1->DR;         //返回收到的数据
// SPI2->SR|=0x01;
// SPI=SPI2->DR;
// delay_ms(200);
// retry=100;
//// CS=1;
// }
// CS=1;
   return  0;
}  
//SPI  速度设置函数
//SpeedSet:
//SPI_SPEED_2          2 分频      (SPI [email=36M@sys]36M@sys[/email] 72M)
//SPI_SPEED_8          8 分频      (SPI [email=9M@sys]9M@sys[/email] 72M)
//SPI_SPEED_16         16 分频   (SPI [email=4.5M@sys]4.5M@sys[/email] 72M)
//SPI_SPEED_256   256 分频   (SPI [email=281.25K@sys]281.25K@sys[/email] 72M)
void SPIx_SetSpeed(u8 SpeedSet)
{
SPI2->CR1&=0XFFC7;   //Fsck=Fcpu/256
if(SpeedSet==SPI_SPEED_2) //二分频
  {
   SPI2->CR1|=0<<3; //Fsck=Fpclk/2=36Mhz
  }
else if(SpeedSet==SPI_SPEED_8)
          //八分频
  {
   SPI2->CR1|=2<<3; //Fsck=Fpclk/8=9Mhz
       }
else if(SpeedSet==SPI_SPEED_16)
        //十六分频
  {
   SPI2->CR1|=3<<3; //Fsck=Fpclk/16=4.5Mhz
  }
else                       //256 分频
  {
   SPI2->CR1|=7<<3;  //Fsck=Fpclk/256=281.25Khz             低速模式
   }
SPI1->CR1|=1<<6;    //SPI 设备使能
}
void SPIx_Init(void)
{
RCC->APB2ENR|=1<<3;         //PORTB 时钟使能
RCC->APB1ENR|=1<<14;        //SPI2 时钟使能
//这里只针对 SPI  口初始化
GPIOB->CRH&=0X000FFFFF;
GPIOB->CRH|=0XBBB00000;  //PB13.14.15 复用
GPIOB->ODR|=0x7<<13;         //PA13.14.15 上拉
GPIOB->CRH&=0XFFF0FFFF;
GPIOB->CRH|=0X00030000;  //PA5.6.7 复用
//GPIOB->ODR|=0X7<<13;         //PA5.6.7 上拉
    SPI2->CR1|=0<<6;    //SPI 设备不使能
SPI2->CR2|=1<<6;   //开发送接收中断
SPI2->CR1|=0<<10;   //全双工模式
SPI2->CR1|=1<<9;    //软件nss 管理
SPI2->CR1|=1<<8;
SPI2->CR1|=1<<2;    //SPI 主机
SPI2->CR1|=0<<11;   //8bit 数据格式
SPI2->CR1|=1<<1;    //空闲模式下SCK 为 1 CPOL=1
SPI2->CR1|=1<<0;    //数据采样从第二个时间边沿开始,CPHA=1
SPI2->CR1|=7<<3;    //Fsck=Fcpu/256
SPI2->CR1|=0<<7;    //MSBfirst
SPI2->CR1|=1<<6;    //SPI 设备使能
MY_NVIC_Init(3,4,SPI2_IRQChannel,4);
SPIx_ReadWriteByte(0xff); //启动传输
}
void SPI2_IRQHandler(void)
{
a++;
}
硬件仿真的时候老是在a++这行了,不知道大家有没有遇到过这种情况
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

13

帖子

2

粉丝