a06040051 发表于 2013-12-6 19:02:27

关于W5100无法ping通……求大神指点啊!!!

使用的是CC430+W5100实现标准SPI通讯,但是我的设置上不知道存在了什么问题没有,我想要请教大神,为什么不能ping通!!我贴出来我的代码……
CC430的初始化部分:
void System_Initialization(void)
{
//P2DIR |= BIT5+BIT4 + BIT3 +BIT2+ BIT1+BIT0 ;
//P2OUT |= BIT1+BIT6;
//P2DIR &= ~ BIT6;
//P2REN |= BIT6;
//P2OUT &= ~ BIT4;

PMAPPWD = 0x02D52;                        // Get write-access to port mapping regs
P1MAP3 = PM_UCB0SIMO;                     // Map UCA0SIMO output to P1.3
P1MAP2 = PM_UCB0SOMI;                     // Map UCA0SOMI output to P1.2
P1MAP4 = PM_UCB0CLK;                      // Map UCA0CLK output to P1.4
PMAPPWD = 0;                              // Lock port mapping registers
   
// P1DIR &= ~ BIT0+BIT2;
// P1DIR |= BIT4 + BIT3 + BIT1;            // Set P1.0, P1.1 to output direction
P1DIR =0x1a;

UCSCTL3 |= SELREF_2;                      // Set DCO FLL reference = REFO
UCSCTL4 |= SELA_2;                        // Set ACLK = REFO

__bis_SR_register(SCG0);                  // Disable the FLL control loop
UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_5;                      // Select DCO range 24MHz operation
UCSCTL2 = FLLD_1 + 749;                   // Set DCO Multiplier for 24 MHz
                                          // (N + 1) * FLLRef = Fdco
                                          // (749 + 1) * 32768 = 24.576 MHz
                                          // Set FLL Div = fDCOCLK/2
__bic_SR_register(SCG0);                  // Enable the FLL control loop*/
P1SEL =0x1c;                              //P1SEL|=BIT2+BIT3+BIT4; // P1.2,3,4 for debugging purposes.

UCB0CTL1 |= UCSWRST;                      // **Put state machine in reset**
UCB0CTL0 =0x29;                           // 3-pin, 8-bit SPI master
                                          // Clock polarity high, MSB
UCB0CTL1 |= UCSSEL_2;                     // SMCLK
UCB0BR0 = 0x02;                           // /2
UCB0BR1 = 0;                              //
UCB0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
}


下面是SPI的发送和使用程序:
unsigned char SPI_SendByte(unsigned char dat)         //发送数据   
{   
    unsigned char rByte;

    while (!(UCB0IFG&UCTXIFG));
    UCB0TXBUF=dat;
    while(!(UCB0IFG&UCRXIFG));
    rByte=UCB0RXBUF;
   
    return rByte;   
}   

/*****************************************************************
程序名:Read_W5100
输入: 地址
输出: 无
返回: 读取的数据
说明:从W5100指定的地址读取一个字节
*****************************************************************/
unsigned char Read_W5100(unsigned short addr)
{       
    unsigned char i;

   /* 置W5100的SCS为低电平 */
    P1OUT &=~BIT1;
    __no_operation();
    /* 发送读命令 */
    SPI_SendByte(0x0f);

    /* 发送地址 */
    SPI_SendByte(addr/256);
    SPI_SendByte(addr);

    /* 发送一个哑数据并读取数据 */
    i=SPI_SendByte(0x00);
   
    /* 置W5100的SCS为高电平 */
    P1OUT |=BIT1;

    return i;
}

/************************************************
程序名:Write_W5100
输入: 地址,字节数据
输出: 无
返回: 无
说明:将一个字节写入W5100指定的地址
************************************************/
void Write_W5100(unsigned short addr, unsigned char dat)
{
        /* 置W5100的SCS为低电平 */
        P1OUT &=~BIT1;

        /* 发送写命令 */
        SPI_SendByte(0xf0);

        /* 发送地址 */
        SPI_SendByte(addr/256);
        SPI_SendByte(addr);

        /* 写入数据 */
        SPI_SendByte(dat);

        /* 置W5100的SCS为高电平 */
        P1OUT |=BIT1;
}

/*------------------------------------------------------------------------------
W5100初始化函数
在使用W5100之前,对W5100初始化
------------------------------------------------------------------------------*/
void W5100_Init(void)
{
        unsigned int i;

        Write_W5100(W5100_MODE,MODE_RST);                /* 软复位W5100 */

        Delay(100);                                        /* 延时100ms */

        /*设置网关(Gateway)的IP地址,4字节 */
        /*使用网关可以使通信突破子网的局限,通过网关可以访问到其它子网或进入Internet*/
        for(i=0;i<4;i++)
                Write_W5100(W5100_GAR+i,Gateway_IP);                /*Gateway_IP为4字节unsigned char数组,自己定义*/

        /*设置子网掩码(MASK)值,4字节。子网掩码用于子网运算*/
        for(i=0;i<4;i++)
                Write_W5100(W5100_SUBR+i,Sub_Mask);                /*SUB_MASK为4字节unsigned char数组,自己定义*/

        /*设置物理地址,6字节,用于唯一标识网络设备的物理地址值
        该地址值需要到IEEE申请,按照OUI的规定,前3个字节为厂商代码,后三个字节为产品序号
        如果自己定义物理地址,注意第一个字节必须为偶数*/
        for(i=0;i<6;i++)
                Write_W5100(W5100_SHAR+i,Phy_Addr);                        /*PHY_ADDR6字节unsigned char数组,自己定义*/

        /*设置本机的IP地址,4个字节
        注意,网关IP必须与本机IP属于同一个子网,否则本机将无法找到网关*/
        for(i=0;i<4;i++)
                Write_W5100(W5100_SIPR+i,IP_Addr);                        /*IP_ADDR为4字节unsigned char数组,自己定义*/

        /*设置发送缓冲区和接收缓冲区的大小,参考W5100数据手册*/
        Write_W5100(W5100_RMSR,0x55);                /* Socket0 Rx memory size=8k--0xff */
        Write_W5100(W5100_TMSR,0x55);                /* Socket0 Tx mempry size=8k--0xff */

        /* 设置重试时间,默认为2000(200ms) */
        /* Write_W5100(W5100_RTR,0x00);    */
        /* Write_W5100(W5100_RTR+1,0x68);*/

        /* 设置重试次数,默认为8次 */
        /* Write_W5100(W5100_RCR,8); */

        /* 启动中断,参考W5100数据手册确定自己需要的中断类型
        IMR_CONFLICT是IP地址冲突异常中断
        IMR_UNREACH是UDP通信时,地址无法到达的异常中断
        其它是Socket事件中断,根据需要添加 */
        Write_W5100(W5100_IMR,(IMR_CONFLICT|IMR_S0_INT));
}
已经在这个问题上纠结了很久,但是就是ping不通,求大神指点啊!!!!

a06040051 发表于 2013-12-6 21:02:51

通过审核了吗?!为什么没有人回答呢?!

zhangyunbo 发表于 2013-12-6 22:18:42

时序都对吗?

a06040051 发表于 2013-12-8 21:59:43

zhangyunbo 发表于 2013-12-6 22:18
时序都对吗?

不好意思,前两天我没在,时序是对的吧,我把两个时序传上来,你看一下我选择是否是正确的,红色的部分是我选择的单片机的相位和极性,应该是没错的吧!!!……

a06040051 发表于 2013-12-8 22:01:32

zhangyunbo 发表于 2013-12-6 22:18
时序都对吗?

我都快崩溃了,一个这个搞了我一个星期了!!!
页: [1]
查看完整版本: 关于W5100无法ping通……求大神指点啊!!!