本人使用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使能引脚,一直拉低应该也没问题吧?谢谢大家!!
|