打印
[DSP编程]

28335与W5100通过spi通讯无法正常

[复制链接]
1028|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaobai032|  楼主 | 2020-3-25 23:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人使用28335与W5100通过spi通讯,DSP的MOSI,MISO,sclk分别与W5100的MOSI,MISO,sclk相连,DSP的[backcolor=rgba(255, 255, 255, 0.5)]SPSTE悬空,W5100的/scs接地。(不知道这样接对不对?)W5100的SEN上拉接3.3V首先通过spi回环测试收发正常。W5100工作于下降沿发送数据,程序如下
void spi_init()
{
  SpiaRegs.SPICCR.all = 0x0047;  // 复位SPI,上升沿接收,下降沿发送,8位数据
  SpiaRegs.SPICTL.all = 0x0006;  // 无相位延时,主模式
  SpiaRegs.SPIBRR = 0x007f; //
  //SpiaRegs.SPICCR.all = 0x00c7;// SPI准备收发数据
  SpiaRegs.SPICCR.all = 0x00d7;// SPI自测模式
  SpiaRegs.SPIPRI.bit.FREE = 1; // SPI自由运行
}

因为w5100的spi为8位,所以编写8位spi通信
Uint16 drv_w5100_spi_tx_byte(Uint16 byte)
{
        Uint16 rdata;
        byte = byte << 8 ; // 左对齐
        while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG != 0); // 发送FIFO不为空,等待
        SpiaRegs.SPITXBUF = byte;
        while(SpiaRegs.SPISTS.bit.INT_FLAG !=1); // 接收FIFO接到数据
        rdata = SpiaRegs.SPIRXBUF;
        rdata = rdata & 0x00FF ;       
        return rdata;
}

void main()
{
  ........
                rda1 = drv_w5100_spi_tx_byte(sda1 / 256);
                rda2 = drv_w5100_spi_tx_byte(sda1 % 256);

}
sda1发送数据为0xABCD, rda1为0x00AB,rda2为0x00CD。这应该说明8位spi通信发送指令没有问题。

但通过spi给W5100发指令,W5100总回复0x00,所以怀疑W5100没有回复数据。
void drv_w5100_init(Uint16 *ip, Uint16 *mac, Uint16 *submask, Uint16 *gateway, \
        Uint16 *socket_tx_size, Uint16 *socket_rx_size)
{
        Uint16 value = 0;

        //初始化IO
        drv_w5100_init_io();
        //SPI初始化
        drv_w5100_init_spi();
        //复位w5100
        drv_w5100_reset();
        DELAY_US(300000L); // 延时300ms
        //软复位
        drv_w5100_tx_byte(W5100_MODE, MODE_RST);
        DELAY_US(300000L); // 延时300ms
        //设置ip
        drv_w5100_set_ip(ip);
        //设置mac
        drv_w5100_set_mac(mac);
        //设置掩码
        drv_w5100_set_submask(submask);
        //设置网关
        drv_w5100_set_gateway(gateway);
        //端口缓存设置
        drv_w5100_set_socket_buf_size(socket_tx_size, socket_rx_size);

        //设置中断
        value = drv_w5100_rx_byte(W5100_IMR); // 读取中断屏蔽寄存器
        value |= IMR_CONFLICT | IMR_UNREACH | \
                IMR_S0_INT | IMR_S1_INT | IMR_S2_INT | IMR_S3_INT; // 中断全部开启
        drv_w5100_tx_byte(W5100_IMR, value); // 配置中断屏蔽寄存器

}

void drv_w5100_reset(void)
{
        GpioDataRegs.GPBCLEAR.bit.GPIO35 = 1;
        DELAY_US(20000L); // 延时20ms
        GpioDataRegs.GPBSET.bit.GPIO35 = 1;
}



void drv_w5100_tx_byte(Uint16 addr, Uint16 byte) // byte实际为8位
{
        //使能w5100
        drv_w5100_enable(1); // 将 /CS拉低
        byte = byte & 0x00FF;
        drv_w5100_spi_tx_byte((WRITE_COMMAND));
        drv_w5100_spi_tx_byte((addr / 256));
        drv_w5100_spi_tx_byte((((addr % 256))));
        drv_w5100_spi_tx_byte(byte);
        //关闭w5100
        drv_w5100_enable(0);
}


Uint16 drv_w5100_rx_byte(Uint16 addr)
{
        Uint16 byte = 0;
        //使能w5100
        drv_w5100_enable(1);
        drv_w5100_spi_tx_byte((READ_COMMAND));
        drv_w5100_spi_tx_byte((addr / 256));
        drv_w5100_spi_tx_byte((addr % 256));
        byte = drv_w5100_spi_tx_byte(0); // 发送伪数据读回
        byte = byte & 0x00FF; // 接收16位数据 实际需要数据在低8位
        //关闭w5100
        drv_w5100_enable(0);
        return byte;
}


void drv_w5100_set_ip(Uint16 *ip)
{
        Uint16 i = 0;

        for (i = 0; i < 4; i++)
        {
                drv_w5100_tx_byte(W5100_SIPR + i, ip);
        }
}

Uint16 IP[4] = {192,168,0,3};
main()
{
.............
        inf_w5100_init(IP,mac,submask,gateway,socket_tx_size,socket_rx_size);
        drv_w5100_get_ip(IPread);

..............
}
读出的IPread的都是0x0000。W5100没有发回数据。不知道是程序出问题还是硬件问题。w5100中的/CS引脚在spi通信模式下是否有用?w5100的[backcolor=rgba(255, 255, 255, 0.5)]/scs是否能接地,说明上说先拉低再发送,发送完拉高。他是spi使能引脚,一直拉低应该也没问题吧?谢谢大家!!

使用特权

评论回复

相关帖子

沙发
zhangmangui| | 2020-3-28 13:52 | 只看该作者
一直使能肯定也是没问题的  

使用特权

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

本版积分规则

15

主题

48

帖子

2

粉丝