打印

双机SPI通信问题

[复制链接]
1173|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yezuoheng|  楼主 | 2016-9-29 13:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
SPI双机通讯,程序并不多,可实在找不出问题在哪里,才在此处求救!~~
主机是GD32F150的芯片,从机是GD103RG的芯片,双方用的都是SPI1,程序分别如下:
这是主机的程序,用的是GD的库,主机先等待接收,再发送;
int main()
{
        usart1_init();
        delay_init(72);
        SpiInit();
        led_test();
        i=0;
        while(1)
        {
                rxbuff[i] = spi_send(txbuff[i]);
                i++;
                if(i>SIZE)i=0;
                printf("the data received are: %c  \n",txbuff[i]);
                delay_ms(10);
                if(txbuff[i] != rxbuff[i])
                {
                        printf("Eorr! data are not match! \n");
                        while(1);
                }
        }
}

uint16_t spi_send(uint8_t data)
{
       
        while(SPI_I2S_GetBitState(SPI1,  SPI_FLAG_RBNE)==RESET);
        SPI_I2S_SendData(SPI1, txbuff[i] );
        return SPI_I2S_ReceiveData(SPI1);
}

void SpiInit(void)
{          /* Initialization GPIO and SPI */
    GPIO_InitPara GPIO_InitStructure;
    SPI_InitPara  SPI_InitStructure;

    /* Enable Peripheral clock */
    RCC_AHBPeriphClock_Enable( RCC_AHBPERIPH_GPIOA, ENABLE);
    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_SPI1,ENABLE);

    /* Configure SPI1 pins: */
    GPIO_PinAFConfig( GPIOA , GPIO_PINSOURCE5, GPIO_AF_0 );
    GPIO_PinAFConfig( GPIOA , GPIO_PINSOURCE6, GPIO_AF_0 );
    GPIO_PinAFConfig( GPIOA , GPIO_PINSOURCE7, GPIO_AF_0 );
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_5| GPIO_PIN_6 | GPIO_PIN_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* SPI1 configuration */
    SPI_InitStructure.SPI_TransType  = SPI_TRANSTYPE_FULLDUPLEX;
    SPI_InitStructure.SPI_Mode = SPI_MODE_MASTER;
    SPI_InitStructure.SPI_FrameFormat  = SPI_FRAMEFORMAT_8BIT;
    SPI_InitStructure.SPI_SCKPL        = SPI_SCKPL_HIGH;//SPI_SCKPL_HIGH
    SPI_InitStructure.SPI_SCKPH = SPI_SCKPH_2EDGE ;//SPI_SCKPH_2EDGE
    SPI_InitStructure.SPI_SWNSSEN= SPI_SWNSS_SOFT;
    SPI_InitStructure.SPI_PSC = SPI_PSC_8 ;
    SPI_InitStructure.SPI_FirstBit = SPI_FIRSTBIT_MSB;
    SPI_InitStructure.SPI_CRCPOL  = 7;
    SPI_Init(SPI1, &SPI_InitStructure);

    /* Enable SPI AND SPI2 CRC calculation */
  //  SPI_CRC_Enable(SPI1, ENABLE);
    /* Enable SPI1  */
    SPI_Enable(SPI1, ENABLE);
}


以下是从机程序,用ST的库,从机先发送一个字节,再等待接收

int main(void)
{  
        LED_Init();
        delay_init(72);
        RCC_Configuration();
        uart_init(115200);
        GPIO_Configuration();
        SPI_init();
        i=0;
        while(1)
        {
                SPI_I2S_SendData(SPI1, SPI_MASTER_Buffer_Tx[i]);
                while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)==RESET);
                SPI_SLAVE_Buffer_Rx[i] = SPI_I2S_ReceiveData(SPI1);
                LED1 = !LED0;
                delay_ms(200);

                i++;
                if(i>SIZE) i=0;
        }
}

void RCC_Configuration(void)
{
    RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,  ENABLE);
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
}

void GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        /*SPI1-Slave GPIO Init*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; //SF_PIN_SCK | SF_PIN_MISO | SF_PIN_MOSI;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        /* ÅäÖÃƬѡ¿ÚÏßΪÍÆÍìÊä³öģʽ */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOA, GPIO_Pin_4);
       
}
void SPI_init()
{
        SPI_InitTypeDef  SPI_InitStructure;
        /*SPI1-Slave  Init*/
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //ÉèÖÃSPIµ¥Ïò»òÕßË«ÏòµÄÊý¾Ýģʽ:SPIÉèÖÃΪ˫ÏßË«ÏòÈ«Ë«¹¤
        SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;                //ÉèÖÃSPI¹¤×÷ģʽ:ÉèÖÃΪÖ÷SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //ÉèÖÃSPIµÄÊý¾Ý´óС:SPI·¢ËͽÓÊÕ8λ֡½á¹¹
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //Ñ¡ÔñÁË´®ÐÐʱÖÓµÄÎÈ̬:ʱÖÓÐü¿Õ¸ß
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //Êý¾Ý²¶»ñÓÚµÚ¶þ¸öʱÖÓÑØ
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSSÐźÅÓÉÓ²¼þ£¨NSS¹Ü½Å£©»¹ÊÇÈí¼þ£¨Ê¹ÓÃSSI룩¹ÜÀí:ÄÚ²¿NSSÐźÅÓÐSSIλ¿ØÖÆ
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;                //¶¨Ò岨ÌØÂÊÔ¤·ÖƵµÄÖµ:²¨ÌØÂÊÔ¤·ÖƵֵΪ256
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //Ö¸¶¨Êý¾Ý´«Êä´ÓMSBλ»¹ÊÇLSBλ¿ªÊ¼:Êý¾Ý´«Êä´ÓMSBλ¿ªÊ¼
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRCÖµ¼ÆËãµÄ¶àÏîʽ
        SPI_Init(SPI1, &SPI_InitStructure);  //¸ù¾ÝSPI_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèSPIx¼Ä´æÆ÷

        SPI_Cmd(SPI1, ENABLE); //ʹÄÜSPIÍâÉè
        //SPI1->DR = 0XFFff;
}


无论哪个先发送,另一方总是卡在等待接收的语句上,硬件连接应该没问题,双方的PA5,6,7分别连接PA5,6,7。
哪位大神能点醒一下,感激不尽!






沙发
eddy-zhong| | 2016-9-29 14:03 | 只看该作者
代理路过,可以找你对接的代理去解决,解决不了就找原厂技术支持。

使用特权

评论回复
板凳
咫音| | 2016-10-3 11:05 | 只看该作者
本帖最后由 咫音 于 2016-10-3 11:07 编辑

从机需要先等待TXE(发送缓冲为空)位置位了,再发送数据,从机发数据也得有主机提供时钟

使用特权

评论回复
地板
一事无成就是我| | 2016-10-5 20:17 | 只看该作者
SPI有主从之分,不想去看你得代码,如果你是采用四轴飞行器通讯,待机全部设置成从机,当要作为主机发送得时候再转换到主机,这个主机状态要一直保持到你整个交互过程完成。再回到原始得待机从机模式

使用特权

评论回复
5
vivilzb1985| | 2016-10-16 09:38 | 只看该作者
io扣相关的相关寄存器的设置很重要的。

使用特权

评论回复
6
LIUXRUI2010| | 2016-10-16 09:48 | 只看该作者
从机PA4配置错误

使用特权

评论回复
7
shenmu2012| | 2016-10-16 12:47 | 只看该作者
这个需要协调好主从通讯模式的。。

使用特权

评论回复
8
firstblood| | 2016-10-16 14:29 | 只看该作者
如楼上所言,注意主辅通讯的设置的,两边的通讯速率的要统一的。

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝