|
使用的是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[i]); /*Gateway_IP为4字节unsigned char数组,自己定义*/
/*设置子网掩码(MASK)值,4字节。子网掩码用于子网运算*/
for(i=0;i<4;i++)
Write_W5100(W5100_SUBR+i,Sub_Mask[i]); /*SUB_MASK为4字节unsigned char数组,自己定义*/
/*设置物理地址,6字节,用于唯一标识网络设备的物理地址值
该地址值需要到IEEE申请,按照OUI的规定,前3个字节为厂商代码,后三个字节为产品序号
如果自己定义物理地址,注意第一个字节必须为偶数*/
for(i=0;i<6;i++)
Write_W5100(W5100_SHAR+i,Phy_Addr[i]); /*PHY_ADDR6字节unsigned char数组,自己定义*/
/*设置本机的IP地址,4个字节
注意,网关IP必须与本机IP属于同一个子网,否则本机将无法找到网关*/
for(i=0;i<4;i++)
Write_W5100(W5100_SIPR+i,IP_Addr[i]); /*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不通,求大神指点啊!!!! |
|