打印
[复制链接]
1380|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zwxhehe2012|  楼主 | 2014-1-13 22:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
很奇怪的软件问题:
当主程序 while(1)循环中添加了if (value==0x40)这行语句之后,SPI通讯的时钟莫名其妙的变成了125KHZ,我在Init_Spi ();函数中设定的SPI通讯时钟为4M,去掉if (value==0x40)这行语句之后,SPI的SCK时钟频率就恢复为4M,请教各位大侠,使用的单片机为PIC16F1503,SPI的SCK时钟频率只有修改寄存器SSP1CON1才可以更改,在while(1)循环中添加了if (value==0x40)怎么会出现这样的问题?
#include <pic.h>
#include "spi.h"

#define IRCF   0X7A
#define READ_REG        0x00
#define STATUS_RF          0x07

U8 Spi_Write (U8 data)
{
  U8 databyte;
  PIR1 &= ~SSP1IF1 ;// clear SSP interrupt bit
  SSP1BUF = data ;
  while(!(PIR1&SSP1IF1));    // Wait for interrupt flag to go high indicating transmission is co
  databyte = SSP1BUF;     // Read the incoming data byte
  return (databyte);
}


U8 Spi_Read(void)
{
       U8 databyte;
    PIR1 &= ~SSP1IF1 ;     // Clear SSP interrupt bit
    SSP1BUF = 0;      // Write dummy data byte to the buffer to initiate transmission
    while(!(SSP1STAT&BF1));    // Wait for interrupt flag to go high indicating transmission is complete
    databyte = SSP1BUF;     // Read the incoming data byte
    return (databyte);
}


U8 Spi_RD_Reg (U8 reg)
{
  U8 temp = 0;
  CSN_ENABLE ;
  Spi_Write (reg);
  temp = Spi_Read();
  CSN_DISABLE;
  return (temp) ;
}


U8 rx_array[5]={0};
U8 i;
void main (void)
{
U8 value =0;
__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&CLKOUTEN_OFF&BOREN_ON&CP_OFF&MCLRE_ON);
__CONFIG(LVP_OFF);  
  OSCCON |= IRCF ;  // 内部时钟16M
TRISA &= (~BIT4) ;
LATA &= ~BIT4 ;
Init_Spi ();
Init_NRF24L01();

while (1)
{
   value =Spi_RD_Reg (READ_REG+STATUS_RF);
   if (value==0x40)
    LATA |= BIT4 ;
}

}

沙发
yklstudent| | 2014-1-14 07:53 | 只看该作者
怎么测的 很好奇

使用特权

评论回复
板凳
yewuyi| | 2014-1-14 10:59 | 只看该作者
看看PICC安装目录下的IIC示范程序怎么写的

使用特权

评论回复
地板
zwxhehe2012|  楼主 | 2014-1-14 17:51 | 只看该作者
我就奇怪为什么添加了if (value==0x40)这个语句会影响到SPI的通讯时钟,测试就是用示波器测SCK信号的波形,main函数中一添加if (value==0x40)这句,SCK波形就变为125KHZ,去掉该语句,重新编译烧录,SCK信号波形就恢复到4MHZ

使用特权

评论回复
5
zwxhehe2012|  楼主 | 2014-2-5 13:02 | 只看该作者
好像是程序问题,后来添加了__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&CLKOUTEN_OFF&BOREN_ON&CP_OFF&MCLRE_ON);
其中的PWRTE_ON好像正常了

使用特权

评论回复
6
xyz549040622| | 2014-2-5 13:18 | 只看该作者
zwxhehe2012 发表于 2014-2-5 13:02
好像是程序问题,后来添加了__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&CLKOUTEN_OFF&BOREN_ON&CP_OFF&MCLRE_ ...

配置位就然没写。。。

使用特权

评论回复
7
zwxhehe2012|  楼主 | 2014-2-6 11:05 | 只看该作者
原来也有配置位,只是好像少了PWRTE_ON这个选项

使用特权

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

本版积分规则

14

主题

48

帖子

1

粉丝