[PIC®/AVR®/dsPIC®产品]

请教:PIC16F1503 SPI通信问题

[复制链接]
4900|15
手机看帖
扫描二维码
随时随地手机跟帖
zwxhehe2012|  楼主 | 2013-12-29 17:07 | 显示全部楼层 |阅读模式
本帖最后由 zwxhehe2012 于 2013-12-29 17:11 编辑

SSPSTAT寄存器.png SSPSTAT寄存器配置.png SSPCON1寄存器.png SSPCON1寄存器设置1.png SSPCON1寄存器设置2.png SCH.png PIC16F1503 SPI程序调了几天,MSSP模块配置部分就几条语句,就是不成功,SCK脚没有方波信号输出,感觉好像MSSP模块没有启动,麻烦指教一下是什么问题造成的?
程序如下:
#define  BIT0    0X1
#define  BIT1    0X2
#define  BIT2    0X4
#define  BIT3    0X8
#define  BIT4    0X10
#define  BIT5    0X20
#define  BIT6    0X40
#define  BIT7    0X80
#define SSPEN_ENABLE   0X20
#define SPI_FOSC_4M    0XF
#define CKP_LOW_IDEL   0X10
#define SMP_SPI            0X80
#define CKE_HIGH       0X40
#define EN_SSP1IE      0X8
#define SSP1IF1      0X4

#define IRCF   0X7A

void Init_Spi (void)
{
  TRISC = TRISC &(~BIT2) &(~BIT0) &(~BIT4) |BIT1 |BIT3;      //(SDI : RC1  INPUT)  (SDO : RC2  OUTPUT ) (SCK :RC0 OUTPUT )  (CE :RC4  OUTPUT)
  TRISA = TRISA &(~BIT5) |BIT2;      // (CSN :RA5 OUTPUT) (IRQ:RA2 INPUT)
  SSPCON1 = SSPCON1 &(~SPI_FOSC_4M) &(~CKP_LOW_IDEL) |SSPEN_ENABLE;           //  FOSC: 16M   SPI_CLK= FOSC/4=4M  CKP = 0
  SSPSTAT = SSPSTAT &(~SMP_SPI) |CKE_HIGH;    //CKE= 1  SMP =0
   PIE1 |=  EN_SSP1IE ;          //允许SPI中断
}

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

void main (void)
{
OSCCON |= IRCF ;  // 内部时钟16M
Init_Spi ();

while (1)
{
   Spi_Write (0X55);

}

}







评论
知秋一叶ol 2018-12-21 11:05 回复TA
@bellstudio :而且1503里面没有片选CS这个脚 
知秋一叶ol 2018-12-21 10:52 回复TA
@bellstudio :楼主的这个程序能跑的起来?我试了下,好像不行诶!! 
知秋一叶ol 2018-12-21 08:46 回复TA
CSN_ENABLE是什么意思,,PIN引脚里找不到 
NE5532| | 2013-12-29 22:03 | 显示全部楼层
1.尽量使用英文数据手册,中文出现错误的概率较高
2.SPI相关口线上有没有模拟功能,是否关闭?
3.芯片有没有功能引脚映射或者引脚第二功能配置模块(这个在近代单片机里很流行)
4.芯片有没有功耗控制模块(各模块的电源或者时钟总开关),开了没有
5.把寄存器赋值直接用“=0xHH”的方式来写,先不要用位定义,以免出低级错误
6.找供应商要例子程序回来研究

使用特权

评论回复
Auto_lee| | 2013-12-30 13:45 | 显示全部楼层
PIE1 |=  EN_SSP1IE ;          //允许SPI中断
既然用的是查询做的,为什么要打开中断?而且没有中断函数。

使用特权

评论回复
zwxhehe2012|  楼主 | 2013-12-30 21:14 | 显示全部楼层
删除PIE1 |= EN_SSP1IE;   结果还是一样

使用特权

评论回复
goldtiny| | 2014-1-2 00:22 | 显示全部楼层
尝试一下给CSN 高电平 设置RA5的PORTA

使用特权

评论回复
yewuyi| | 2014-1-2 08:55 | 显示全部楼层
在PICC下面应该有例程。

使用特权

评论回复
Auto_lee| | 2014-1-2 10:00 | 显示全部楼层
你把这句屏蔽PIE1 |=  EN_SSP1IE ;          //允许SPI中断
函数试试这个?同菜鸟·
U8 Spi_Write (U8 data)
{
U8 databyte;
CSN_ENABLE;
SSP1STATbits.BF=0;
SSPBUF = data ;
while(!SSP1STATbits.BF);
databyte=SSPBUF;
CSN_DISABLE;
SSP1STATbits.BF=0;
return (databyte);
}

使用特权

评论回复
zwxhehe2012|  楼主 | 2014-1-9 16:49 | 显示全部楼层
后来发现是PIC芯片的头文件的问题,奇怪,编译器中PIC16F1503.h的定义的SSPCON1,SSPSTAT,SSPBUF这些寄存器的地址与PIC16F1503datasheet中定义的地址不对,后来没有使用#include <pic.h>,自己重新写了头文件,但是现在接上PICKIT3后,SPI通讯正常,但是把程序用PICKIT3烧写进单片机后,关掉编译器,或者拔掉PICKIT3后,单片机SPI通讯就不正常了,SCK信号输出正常,但是SDO输出信号不正常,平时变为高电平,请教一下这个是什么问题造成的?

使用特权

评论回复
WUZHIXIONG23| | 2017-9-25 11:55 | 显示全部楼层
终于找到相同问题的了,请问大神最终怎么解决的

使用特权

评论回复
WUZHIXIONG23| | 2017-9-25 12:01 | 显示全部楼层
我目前也是用1503通信,片选信号,sdio信号,时钟信号都有,读回的数据总是0

使用特权

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

本版积分规则

14

主题

48

帖子

1

粉丝