打印
[总线接口]

stm8s103 SPI按规格书一步步写就是通信不了

[复制链接]
1685|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qq583678156|  楼主 | 2017-10-30 17:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
主机IO口初始化
  //CSK--->PC5
  PC_DDR_bit.DDR5 = 1;   
  PC_CR1_bit.C15 = 1;   
  PC_CR2_bit.C25 = 1;     
  //MOSI--->PC6
  PC_DDR_bit.DDR6 = 1;
  PC_CR1_bit.C16 = 1;   
  PC_CR2_bit.C26 = 1;  
  //MISO--->PC7
  PC_DDR_bit.DDR7 = 0;  
  PC_CR1_bit.C17 = 0;   
  PC_CR2_bit.C27 = 0;   
  //NSS--->PA3
  PA_DDR_bit.DDR3 = 1;  
  PA_CR1_bit.C13 = 1;
  PA_CR2_bit.C23 = 1;  

SPI设置
void  SPI_Init()
{   
    SPI_CR1_bit.BR = 1;     //设置SPI速率  /4
    SPI_CR1_bit.CPOL = 0;   //
    SPI_CR1_bit.CPHA = 0;
    SPI_CR1_bit.MSTR = 1;       //主设备模式
    SPI_CR2_bit.SSI = 1;         //主设备 SSI引脚不用
    SPI_CR2_bit.SSM = 1;
    SPI_CR1_bit.LSBFIRST = 0;   //先发送MSB位
    SPI_CR1_bit.SPE = 1;        //使能SPI设备
}

写入单字节
unsigned char spi_rw_byte(unsigned char byte)
{
  unsigned char retry = 0;

  while(SPI_SR_bit.TXE == 0)
  {
    retry++;
    if(retry > 200)
      return 0;
  }
  SPI_DR = byte;

  retry=0;
  while(SPI_SR_bit.RXNE == 0)  //等待接收完一个byte  
  {
    retry++;
    if(retry > 200)return 0;
  }                         

  return SPI_DR;          //返回收到的数据       
}


主函数
初始化后一秒钟发个字节
spi_io_initial();
  SPI_Init();  
while(1)
  {
    SPI_NSS=0;
    spi_rw_byte(a);
    SPI_NSS=1;
    delay(1000);
    LED=~LED;
    a++;
  }

//////////////////////////
从机
IO口初始化
  //CSK--->PC5
  PC_DDR_bit.DDR5 = 0;  
  PC_CR1_bit.C15 = 0;     
  PC_CR2_bit.C25 = 0;   
  //MOSI--->PC6
  PC_DDR_bit.DDR6 = 0;   
  PC_CR1_bit.C16 = 0;   
  PC_CR2_bit.C26 = 0;   
  //MISO--->PC7
  PC_DDR_bit.DDR7 = 1;
  PC_CR1_bit.C17 = 1;     
  PC_CR2_bit.C27 = 1;   
  //SPI_NSS--->PA3
  PA_DDR_bit.DDR3 = 0;   
  PA_CR1_bit.C13 = 1;   
  PA_CR2_bit.C23 = 0;

SPI设置
void  SPI_Init()
{
//    SPI_CR1_bit.BR = 1;     //设置SPI速率  /4
    SPI_CR1_bit.CPOL = 0;   //空闲时SCK为高
    SPI_CR1_bit.CPHA = 0;   //数据从第一个时钟沿开始
    SPI_CR1_bit.LSBFIRST = 0;   //先发送MSB位   
    SPI_CR2_bit.SSM = 0;
    SPI_CR2_bit.SSI = 0;
    SPI_CR1_bit.MSTR = 0;       //从设备模式
    SPI_CR2_bit.SSM = 1;        //使能SPI设备
}


写入单字节
unsigned char spi_rw_byte(unsigned char byte)
{
  unsigned char retry = 0;

  while(SPI_SR_bit.TXE == 0)
  {
    retry++;
    if(retry > 200)
      return 0;
  }
  SPI_DR = byte;

  retry=0;
  while(SPI_SR_bit.RXNE == 0)  //等待接收完一个byte  
  {
    retry++;
    if(retry > 200)return 0;
  }                         

  return SPI_DR;          //返回收到的数据       
}


主函数
等待中断接收数据改变指示灯
  spi_io_initial();
  SPI_Init();
  SPI_ICR = 0x40;  
  asm("rim");

while(1);



/**     SPI中断服务函数       */
#pragma vector = 12
__interrupt void SPI_IRQHandler(void)
{
  if(SPI_SR_bit.RXNE==1)
  LED=~LED;

SPI_SR_bit.RXNE=0;




//////////////////////////////////////
主机和从机基本这么写了的,用swim调试,就没看见SPI_DR里面有过数据,从机也没看见进过中断,请问高手们,我这个是主机还是从机,哪里有问题,就是不可以用呢?

相关帖子

沙发
aozima| | 2017-10-30 19:46 | 只看该作者
请用逻辑*分析*仪

使用特权

评论回复
板凳
qq583678156|  楼主 | 2017-10-30 20:06 | 只看该作者
自己买的小模块,没有示波器等这些工具

使用特权

评论回复
地板
junyee| | 2017-11-3 08:27 | 只看该作者
我在实际应用中,不用 retry,
直接 while(...) send.
甚至连接收也直接 读 寄存器.
也没发现出什么问题...



使用特权

评论回复
5
qq583678156|  楼主 | 2017-11-6 16:58 | 只看该作者
junyee 发表于 2017-11-3 08:27
我在实际应用中,不用 retry,
直接 while(...) send.
甚至连接收也直接 读 寄存器.

retry在这个位置也就一个短暂延时的作用,那和你的也就没有什么区别了???那怎么就我的不行呢

使用特权

评论回复
6
finastic| | 2017-11-12 21:44 | 只看该作者
当retry等于200的时候,执行语句return 0语句,不仅跳出了while循环,而且跳出了函数spi_rw_byte,将return 0换成break语句;另外200次计数是否可靠,也得多调试调试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

54

帖子

0

粉丝