TXAM 发表于 2013-4-22 14:35:02

SPI求解

请问 各位大侠用spi做通信的时候

比如用 spi0 发给spi1 一个数0x123

能够这样 if(SPI_ReceiveData(SPI1))==0x123直接判断spi1收到的是否是0x123吗??

xuchunjie 发表于 2013-4-22 17:04:59

语法有问题,那个判断应该在括号里面的吧。另,可以理解为常量和RAM中的值作比较,可以的,不推荐!

achieveIEEE 发表于 2013-4-22 17:22:10

中英文字符杂交,呵呵{:tongue:}

TXAM 发表于 2013-4-22 19:08:59

xuchunjie 发表于 2013-4-22 17:04 static/image/common/back.gif
语法有问题,那个判断应该在括号里面的吧。另,可以理解为常量和RAM中的值作比较,可以的,不推荐! ...

额,这怪我没写规范,程序里是这样写的,if(SPI_RecieveData(SPI0)==0x123),但是我发现无论发什么,收到的都是0XFF。。。。求解啊

jumpjet 发表于 2013-4-22 19:32:02

spi一次是8位啊0x123 溢出了 当然就是0xff

TXAM 发表于 2013-4-22 19:40:16

jumpjet 发表于 2013-4-22 19:32 static/image/common/back.gif
spi一次是8位啊0x123 溢出了 当然就是0xff

无论发什么,0x01,0x02...都是收到0XFF,而且sendbuffer 测出来也是0xff

jumpjet 发表于 2013-4-22 20:23:51

楼主先用示波器 看看波形呗

TXAM 发表于 2013-4-22 21:43:28

身边没有示波器。。。哪位大侠能发一个 用spi0只发送一个数据,spi1接收到后检测是否正确的例程啊。。求高人啊

xuchunjie 发表于 2013-4-23 10:03:29

检查一下SPI的初始化配置。

TXAM 发表于 2013-4-23 21:08:20

xuchunjie 发表于 2013-4-23 10:03 static/image/common/back.gif
检查一下SPI的初始化配置。

#include "ht32f175x_275x.h"
u8 r,t;
SPI_InitTypeDef SPI_InitStructure;

u8 spi0_writebyte(u8 byte)
{
    /* Check on SPI1 Tx Buffer empty */
    while(SPI_GetFlagStatus(SPI0, SPI_FLAG_TXBE)==RESET);
    /* Send SPI1 data */
    SPI_SendData(SPI0, byte);//数据经主机MOSI发送 =         SPI0—>DR=byte;
        while(SPI_GetFlagStatus(SPI0, SPI_FLAG_RXBNE)==RESET);
        returnSPI_ReceiveData(SPI0);//主机由MISO接收   
}

int main(void)
{
/* Enable SPI0 ,SPI1 & AFIO APB clock */
CKCU_APBPerip0ClockConfig(CKCU_APBEN0_SPI0 | CKCU_APBEN0_SPI1 | CKCU_APBEN0_AFIO|CKCU_APBEN0_PB, ENABLE);
AFIO_GPBConfig(AFIO_PIN_0 | AFIO_PIN_1 , AFIO_MODE_DEFAULT);
GPIO_DirectionConfig (GPIOB,GPIO_PIN_0|GPIO_PIN_1, GPIO_DIR_OUT) ;
GPIO_WriteOutBits (GPIOB,GPIO_PIN_0|GPIO_PIN_1, SET);
/* configure PD0, PD1, PD2, PD3 to SPI0 mode */
AFIO_GPDConfig(AFIO_PIN_0 | AFIO_PIN_1 | AFIO_PIN_2 | AFIO_PIN_3, AFIO_MODE_2);

/* configure PC0, PC1, PC2, PC3 to SPI1 mode */
AFIO_GPCConfig(AFIO_PIN_0 | AFIO_PIN_1 | AFIO_PIN_2 | AFIO_PIN_3, AFIO_MODE_1);

/* SPI0 configuration */
SPI_InitStructure.SPI_Mode = SPI_MASTER;
SPI_InitStructure.SPI_FIFO = SPI_FIFO_DISABLE;
SPI_InitStructure.SPI_DataLength = SPI_DATALENGTH_8;
SPI_InitStructure.SPI_SELMode = SPI_SEL_HARDWARE;
SPI_InitStructure.SPI_SELPolarity = SPI_SELPOLARITY_LOW;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_LOW;//时钟闲时为低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_FIRST;//第一个上升沿采样
SPI_InitStructure.SPI_FirstBit = SPI_FIRSTBIT_MSB;
SPI_InitStructure.SPI_RxFIFOTriggerLevel = 0;
SPI_InitStructure.SPI_TxFIFOTriggerLevel = 0;
SPI_InitStructure.SPI_ClockPrescaler = 4;
SPI_Init(SPI0, &SPI_InitStructure);

/* SPI1 configuration */
SPI_InitStructure.SPI_Mode = SPI_SLAVE;
SPI_Init(SPI1, &SPI_InitStructure);

/* Enable SPI0 & SPI1 */
SPI_Cmd(SPI0, ENABLE);
SPI_Cmd(SPI1, ENABLE);

/* Set SEL as output mode for slave select */
SPI_SELOutputCmd(SPI0, ENABLE);

/*先将要返回的数值放入SPI1->DR*/
while(SPI_GetFlagStatus(SPI1, SPI_FLAG_TXBE)==RESET);
SPI_SendData(SPI1, 0x12);
for(t=0;t<50;t++);//延时


r=spi0_writebyte(0x12);//主机SPI0向从机SPI1发送数据0x12
for(t=0;t<50;t++);//延时


if(r==0X12)//判定发送与接收的数据是否相等
{
GPIO_WriteOutBits (GPIOB,GPIO_PIN_0|GPIO_PIN_1, RESET);//led亮
}
while(1);   
}

这是源程序,和STM32差不多的芯片,,,最后我发现只有if(r==0xff)的时候,led才会被点亮,也就是说。。。无论主机从miso接收什么,最后得到的都是0xff。。。。求解啊各位大侠!!!!~~

TXAM 发表于 2013-4-23 21:21:03

TXAM 发表于 2013-4-23 21:08 static/image/common/back.gif
#include "ht32f175x_275x.h"
u8 r,t;
SPI_InitTypeDef SPI_InitStructure;


补充一下,这是用开发板做的实验:
spi0作为主机 spi1作为从机
spi0向spi1发送一个数据,spi1收到后回传相同的数据。
官方给的例程都是把数据按数组的形式传输。。。难道单个的数据不行么??

xuchunjie 发表于 2013-4-24 09:39:59

if(r==0X12)//判定发送与接收的数据是否相等....你是这样判断的啊。。你不能直接看从端能否收到么。SPI有没有数据应该可以从状态寄存器的值看出来的,多看看状态寄存器。
页: [1]
查看完整版本: SPI求解