打印
[技术问答]

n76E003 穿墙王SI4463或SI4432

[复制链接]
1003|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guofengyu|  楼主 | 2018-12-4 16:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用N76E003 通过SPI与SI4463或SI4432进行通信,无法正常发送和接收,调试一个多星期没什么进展,有没有用过的大神,能发个程序看看
沙发
IoTCatcher| | 2018-12-4 18:12 | 只看该作者
你有下载BSP看下SPI的代码吗?

使用特权

评论回复
板凳
guofengyu|  楼主 | 2018-12-4 19:47 | 只看该作者
下载了SPI代码,SPI例程看了之后有点茫然,感觉有点乱,怎么连基本的读写都没有

使用特权

评论回复
地板
598330983| | 2018-12-4 21:47 | 只看该作者
我看例子很好的啊。哪儿乱了,有初始化,有主机模式例程,和从机模式例程,你这个是应该使用主机模式的。
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Jan/21/2017
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: N76E003 SPI in Master mode demo code
//***********************************************************************************************************

#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"

//***********************************************************************************************************
//  Application: SPI Function
//  Master send 0x90 and recevie 0x4E
//  Master send 0x01 and recevie 0x55
//  Master send 0x02 and recevie 0x56
//  Master send 0x03 and recevie 0x4F
//  Master send 0x04 and recevie 0x54
//
//  Master recevie 0x4E and 0x4F form slave after transmitting
//
//  Output : P1.4 & P2.1 flash when SPI pass
//           UART show result on hyper-terminal
//           P0.7 flash when SPI error
//***********************************************************************************************************

#if 0
///*****************************************************************************************
//* For ADC INIT setting
//*****************************************************************************************/
//#define                SPICLK_DIV2                        clr_SPR0;clr_SPR1
//#define                SPICLK_DIV4                        set_SPR0;clr_SPR1
//#define                SPICLK_DIV8                        clr_SPR0;set_SPR1
//#define                SPICLK_DIV16                set_SPR0;set_SPR1
//#define                Enable_SPI_Interrupt                set_ESPI;set_EA
//#define                SS                P15
#endif

//-----------------------------------------------------------------------------------------------------------
void SPI_Error(void)
{
    printf ("\nSPI error.\n");
    while(1)                                    // SPI error and P0.7 flash/
    {
        P07 = 1;
        Timer0_Delay1ms(500);
        P07 = 0;
        Timer0_Delay1ms(500);
    }
        }
//-----------------------------------------------------------------------------------------------------------
void SPI_Initial(void)
{              
                P15_Quasi_Mode;                                                                                                                // P15 (SS) Quasi mode
                P10_Quasi_Mode;                                                                                                                // P10(SPCLK) Quasi mode
                P00_Quasi_Mode;                                                                                                                // P00 (MOSI) Quasi mode
    P01_Quasi_Mode;                                                                                                                // P22 (MISO) Quasi mode
            
    set_DISMODF;                                                                                                                        // SS General purpose I/O ( No Mode Fault )
    clr_SSOE;
   
    clr_LSBFE;                                                                                                                                // MSB first         

    clr_CPOL;                                                                                                                                        // The SPI clock is low in idle mode
    set_CPHA;                                                                                                                                        // The data is sample on the second edge of SPI clock
   
    set_MSTR;                                                                                                                                        // SPI in Master mode
     
    SPICLK_DIV2;                                                                                                                        // Select SPI clock
    Enable_SPI_Interrupt;                                                                                        // Enable SPI interrupt
    set_SPIEN;                                                                                                                                // Enable SPI function
}
//-----------------------------------------------------------------------------------------------------------
void Start_Sending_SPI(UINT8 *pu8MID,UINT8 *pu8DID)
{
    SS = 0;

    SPDR = 0x90;                                // Send 0x90 to Slave
    PCON |= SET_BIT0;                           // Enter idle mode
    if(SPDR != 0x4E)                            // Receive slave 1st DATA
       SPI_Error();
    printf ("\nSlave Return %c!\n",SPDR);
                                          
    SPDR = 0x01;                                // Send 0x01 to Slave
    PCON |= SET_BIT0;                           // Enter idle mode
    if(SPDR != 0x55)                            // Receive slave 2nd DATA  
       SPI_Error();
    printf ("\nSlave Return %c!\n",SPDR);

    SPDR = 0x02;                                // Send 0x02 to Slave
    PCON |= SET_BIT0;                           // Enter idle mode
    if(SPDR != 0x56)                            // Receive slave 3rd DATA
       SPI_Error();
    printf ("\nSlave Return %c!\n",SPDR);

    SPDR = 0x03;                                // Send 0x03 to Slave
    PCON |= SET_BIT0;                           // Enter idle mode
    if(SPDR != 0x4F)                            // Receive slave 4th DATA
       SPI_Error();
    printf ("\nSlave Return %c!\n",SPDR);

    SPDR = 0x04;                                // Send 0x04 to Slave
    PCON |= SET_BIT0;                           // Enter idle mode
    if(SPDR != 0x54)                            // Receive slave 5th DATA
       SPI_Error();
    printf ("\nSlave Return %c!\n",SPDR);

    SPDR = 0x4F;                  
    PCON |= SET_BIT0;                           // Enter idle mode
    *pu8MID = SPDR;                             // Receive Slave 1st DATA fron Slave      
    printf ("\nSlave Return %c!\n",SPDR);

    SPDR = 0x4E;                  
    PCON |= SET_BIT0;                           // Enter idle mode            
    *pu8DID = SPDR;                             // Receive Slave 2nd DATA from Slave
    printf ("\nSlave Return %c!\n",SPDR);

    SS = 1;   
}
//-----------------------------------------------------------------------------------------------------------
void main(void)
{      
    UINT8 u8MID,u8DID;
   
    Set_All_GPIO_Quasi_Mode;
    InitialUART0_Timer1(115200);             /* 115200 Baud Rate*/

    SPI_Initial();

    printf ("\nSPI Start Transmit...\n");

    Start_Sending_SPI(&u8MID,&u8DID);
        
    if((u8MID != 0x4F)&&(u8DID != 0x4E))
        SPI_Error();

    printf ("\nSPI Test OK!\n");
    while(1)                                    // SPI transmission finish
    {
        P12 = 1;
        Timer0_Delay1ms(500);
        P12 = 0;
        Timer0_Delay1ms(500);
    }
}
//-----------------------------------------------------------------------------------------------------------
void SPI_ISR(void) interrupt 9                  // Vecotr [url=home.php?mod=space&uid=72445]@[/url]  0x4B
{
    clr_SPIF;
    Timer3_Delay10us(1);
}
//-----------------------------------------------------------------------------------------------------------

使用特权

评论回复
5
598330983| | 2018-12-4 21:48 | 只看该作者
前面的宏定义的内容是用于测试收发的。比如定义的发送什么,要收到什么。来判断是否正确。你可以忽略这部分,你就看初始化,和发送函数和接收函数。

使用特权

评论回复
6
598330983| | 2018-12-4 21:53 | 只看该作者
楼主如果看不懂例程,很有可能是C语言没有学好啊。我仔细看了一遍,没啥难理解的。这个发送函数你需要变通使用。
因为这个里面传递进去的是地址。是要收内容用的,发送的是个固定书,你看每行的备注。

使用特权

评论回复
7
guofengyu|  楼主 | 2018-12-8 09:43 | 只看该作者
有没有SI4463在这个平台上的驱动程序?

使用特权

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

本版积分规则

8

主题

11

帖子

1

粉丝