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

PIC16F1503的MSSP配置为SPI与芯片通信,MISO脚读回数据有误

[复制链接]
3911|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Love萍萍|  楼主 | 2014-3-18 18:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用PIC16F1503利用SPI口对LT8900进行读写操作。
通过示波器观察波形,现在发现:写进去的字节波形是对的,但是读回来的字节波形有对的,也有错的。
即MISO返回的数据是有误的。

硬件上,SCK,MISO,MOSI和芯片是直接连接的,没加上拉或下拉电阻
问题到底出在哪呢??望高手们指教
对SPI的配置如下:
void SPI_Init(void)
{
    TRISCbits.TRISC0 = 0;   //SCK引脚设置为输出
    TRISCbits.TRISC1 = 1;   //MISO引脚设置为输入
    TRISCbits.TRISC2 = 0;   //MOSI引脚设置为输出
    TRISCbits.TRISC4 = 0;   //片选引脚设置为输出
    APFCONbits.SDOSEL = 0;  //SDO功能在引脚 RC2-
    //配置SPI的格式               //1,1,1或者0,0,0
    SSP1STAT |= (0X01 << 7);
    SSP1CON1 = 0X21;       //SPI Master mode,clock = Fosc/16 = 1Mhz,使能SPI
}

//SPI接口发送和接收数据函数
static unsigned char SPI_SendReadByte(unsigned char dat)
{
    unsigned char readbyte;
  //  SSP1CON1bits.WCOL = 0;   //清楚写冲突标志位(WCOL),允许写SSP1BUF寄存器
    PIR1bits.SSP1IF = 0;
  //  SSP1CON1bits.SSPOV = 0;
    SSP1BUF = dat;
    while(!PIR1bits.SSP1IF);
    PIR1bits.SSP1IF = 0;
    while(!SSP1STATbits.BF);
    readbyte = SSP1BUF;        //读取接收缓冲器中的数据
   // PIR1bits.SSP1IF = 0;  //清除接收完成标志位
    return readbyte;      //返回接收到的数据
}

unsigned int LT_ReadReg(unsigned char reg)
{
    unsigned char ReadValueH,ReadValueL;
    LATCbits.LATC4 = 0;           //片选引脚拉低,使能
    SPI_SendReadByte(reg+0X80);    //读取寄存器的值
    Delay_5us;
    ReadValueH = SPI_SendReadByte(0X00);
    ReadValueL = SPI_SendReadByte(0X00);
    Delay_5us;
    LATCbits.LATC4 = 1;
    return (ReadValueH << 8 + ReadValueL);  //返回读取到的寄存器值
}




沙发
Love萍萍|  楼主 | 2014-3-18 18:38 | 只看该作者
@NE5532 ,版主大人,来看下呗。

使用特权

评论回复
板凳
Auto_lee| | 2014-3-19 10:47 | 只看该作者
unsigned char ReadValueH 定义成int试试?

使用特权

评论回复
地板
Love萍萍|  楼主 | 2014-3-19 14:23 | 只看该作者
Auto_lee 发表于 2014-3-19 10:47
unsigned char ReadValueH 定义成int试试?

这个貌似没什么关系的吧。

使用特权

评论回复
5
Auto_lee| | 2014-3-19 16:21 | 只看该作者
ReadValueH char类型直接左移8位不溢出?

使用特权

评论回复
6
Love萍萍|  楼主 | 2014-3-19 19:40 | 只看该作者
Auto_lee 发表于 2014-3-19 16:21
ReadValueH char类型直接左移8位不溢出?

我现在都已经改成 unsgiend int 类型了。。。没改变啊??

使用特权

评论回复
7
电子超新星| | 2014-3-19 19:49 | 只看该作者
不懂

使用特权

评论回复
8
电子超新星| | 2014-3-19 19:49 | 只看该作者

使用特权

评论回复
9
Auto_lee| | 2014-3-20 11:49 | 只看该作者
ReadValueH << 8  加括号  +优先级高·

使用特权

评论回复
10
兰天白云| | 2014-3-20 15:47 | 只看该作者
MISO引脚弄一个上拉试试

使用特权

评论回复
11
Love萍萍|  楼主 | 2014-3-21 16:59 | 只看该作者
兰天白云 发表于 2014-3-20 15:47
MISO引脚弄一个上拉试试

我外部已经接了一个上拉电阻,并且用I/O口模拟了SPI协议,与LT8900进行通信。通过示波器查看波形。

我现在的情况是在MOSI引脚看到的波形是正确的,但是再MISO引脚上看到的波形和我要读回来的正确波形是有出入的。

使用特权

评论回复
12
兰天白云| | 2014-3-28 14:33 | 只看该作者
MISO的输出是有你代码决定的,要查代码了,或者你把手到的数据直接回发,看看MISO引脚输出对不对?

使用特权

评论回复
13
butlet| | 2015-5-13 15:48 | 只看该作者
这个什么问题,后来解决了没有?

使用特权

评论回复
14
WUZHIXIONG23| | 2017-9-25 12:05 | 只看该作者
大神问题解决没有,我的问题跟你一模一样

使用特权

评论回复
15
紫阳真人| | 2017-9-26 11:52 | 只看该作者
Love萍萍 发表于 2014-3-19 19:40
我现在都已经改成 unsgiend int 类型了。。。没改变啊??

我也是1503,现在遇到一个关于移位的问题https://bbs.21ic.com/icview-2262956-1-1.html
不知道作何解释。

使用特权

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

本版积分规则

个人签名:嵌入式软件,DSP,单片机,FPGA.

13

主题

77

帖子

1

粉丝