在线时间0 小时
UID2054354
注册时间2013-11-5
NXP金币0
该用户从未签到
新手上路

- 积分
- 20
- 最后登录
- 1970-1-1
|
主芯片:MK60D10
PCB环境:主板焊接主芯片的最小系统,外加ENC28J60模块电路
问题描述:调试K60的SPI2无法读写ENC28J60
由于是公司项目,同事已经将移植好UCOSii的最小系统做好了,年前我已经移植了LWIP1.4.1,并且ICMP和ARP协议都调通了,PC与目标版可正常PING通(说明硬件是通的),及ARP查询。但是SPI部分是用IO模拟的,没有使用SPI的寄存器读写方式。
由于其他原因,这个项目需要更换网络协议,改做UIP,于是计划用SPI寄存器读写方式来实现,问题出来了,参考了许多版本的SPI驱动,均无法正常读写28J60的版本号,或去写读物理地址,IAR debug进去看到的是读出数据是0。
使用的SPI2,用的是PTB的20,21,22,23端口,分别是CS,CLK,SO,SI
1、主芯片晶振16MHZ CLK0_FREQ_HZ,对其8分频,40倍频后CORE_CLOCK 为80MHZ,BUS_CLOCK为40MHZ
SPI时钟按代码理解,在寄存器默认状态下为busclock/4=20MHZ,这个时钟需要改设置吗?与28J60的晶振25MHZ有关系吗?
2、我看过本论坛有个人贴过帖子有K60+SPI+28J60,但其代码中将SPI中的CS单独拿出来,用做普通IO置低来片选28J60,不必一定这样把?
3、SPI代码如下(来自KINETIS512_V2_SC\src\projects\spi_demo),请有兴趣的大侠们指正,其中是否有什么不对的地方。
/*
by: b35970@freescale.com
*/
#include "hal_spi.h"
static void init_clock(void)
{
SIM_SCGC3 |= SIM_SCGC3_SPI2_MASK;
}
static void init_io(void)
{
#if 0//modify
PORTD_PCR11 &= ~PORT_PCR_MUX_MASK;
PORTD_PCR11 |= PORT_PCR_MUX(2);
PORTD_PCR12 &= ~PORT_PCR_MUX_MASK;
PORTD_PCR12 |= PORT_PCR_MUX(2);
PORTD_PCR13 &= ~PORT_PCR_MUX_MASK;
PORTD_PCR13 |= PORT_PCR_MUX(2);
PORTD_PCR14 &= ~PORT_PCR_MUX_MASK;
PORTD_PCR14 |= PORT_PCR_MUX(2);
#else
PORTB_PCR20 &= ~PORT_PCR_MUX_MASK;
PORTB_PCR20 |= PORT_PCR_MUX(2);
PORTB_PCR21 &= ~PORT_PCR_MUX_MASK;
PORTB_PCR21 |= PORT_PCR_MUX(2);
PORTB_PCR22 &= ~PORT_PCR_MUX_MASK;
PORTB_PCR22 |= PORT_PCR_MUX(2);
PORTB_PCR23 &= ~PORT_PCR_MUX_MASK;
PORTB_PCR23 |= PORT_PCR_MUX(2);
#endif
}
static void init_set_master(void)
{
SPI2_MCR |= SPI_MCR_MSTR_MASK;
}
static void init_fifo(void)
{
SPI2_MCR &= ~SPI_MCR_MDIS_MASK;
SPI2_MCR |= SPI_MCR_DIS_RXF_MASK |
SPI_MCR_DIS_TXF_MASK |
SPI_MCR_CLR_RXF_MASK |
SPI_MCR_CLR_TXF_MASK;
}
static void init_inactive_cs(void)
{
<span style="color: rgb(0, 0, 255);"> SPI2_MCR |= SPI_MCR_PCSIS(1
|
|