|
RT,我在裸机上调试通过了的SPI通信(CC2530为从机,主机为另外一块单片机),可是放到协议栈里面怎么也不调不通,都不知道问题出现在哪里。
程序功能是:从机CC2530通过SPI接收主机(其他MCU)以500ms间隔循环发送的L1#、L2#,#作为结束符,接收后判断若收到的是L1#则从机的LED1闪烁1次,若收到L2#则LED2闪烁一次。
代码如下:
SPI_Rx.c:
/**********************************************
SPI Slave Receive Mode
**********************************************/
#include "ioCC2530.h"
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0
#define LED2 P1_1
char Rxdata[3];
uchar flag = 1;
uchar datanumber = 0;
uchar temp;
void Delayms(uint z)
{
int x,y;
for(x=0;x<z;x++)
for(y=0;y<1774;y++) ;
}
void SPI_Initial()
{
P1DIR |= 0x03; // P1_0、P1_1 as output
LED1 = 1;
LED2 = 1; // LED off
// UTX1IF = 0;
// IEN0 |= 0x88;
PERCFG |= 0x02; // 0000 0010, map USART1 to its alternative 2 location. P1_4: SSN, P1_5: SCK, P1_6: MOSI, P1_7: MISO
P1SEL |= 0xF0; // 1111 0000, P1_4, P1_5, P1_6, and P1_7 are peripherals
U1CSR &= ~0x80; U1CSR |= 0x60; // ~1000 0000, 0110 0000, SPI Slave Mode
U1GCR &= ~0xC0; U1GCR |= 0x20; // ~1100 0000, 0010 0000,MSB
U1BAUD = 216; U1GCR |= 11; // Set baud rate to 115200
}
void Led1Flash(uint j) //LED1 Flash j times
{
int i;
for(i=0;i<j;i++)
{
LED1 = 0;
Delayms(300);
LED1 = 1;
Delayms(300);
}
}
void Led2Flash(uint m) //LED1 Flash j times
{
int n;
for(n=0;n<m;n++)
{
LED2 = 0;
Delayms(300);
LED2 = 1;
Delayms(300);
}
}
void SPI_Rx()
{
while (!(U1CSR&0x04)); U1CSR &= 0xFB;
temp = U1DBUF;
U1DBUF &= 0;
if( flag == 1 )
{
if( temp != 0 )
{
if((temp!='#')&&(datanumber<3)) // '#' as final
Rxdata[datanumber++] = temp;
else flag = 2;
temp = 0;
}
}
if( flag == 2 )
{
if( Rxdata[0] == 'L' )
switch(Rxdata[1]-48) //ASIC Code to number
{
case 1:{Led1Flash(1); break;}
case 2:{Led2Flash(1); break;}
}
flag = 1;
datanumber = 0; //Pointer clear 0
}
}
/*
#pragma vector = URX1_VECTOR
__interrupt void SPI_RXLED(void)
{
URX0IF = 0; // clear interrupt flag
temp = U1DBUF;
if( flag == 1 )
{
if( temp != 0 )
{
if((temp!='#')&&(datanumber<3)) // '#' as final
Rxdata[datanumber++] = temp;
else flag = 2;
temp = 0;
}
}
if( flag == 2 )
{
if( Rxdata[0] == 'L' )
switch(Rxdata[1]-48) //ASIC Code to number
{
case 1:{Led1Flash(1); break;}
case 2:{Led2Flash(1); break;}
}
flag = 1;
datanumber = 0; //Pointer clear 0
}
}
*/
最后注释掉的是中断,可以通过中断方式接收,但是放到协议栈里面去编译报错。。
头文件代码如下:
SPI_Rx.h:
#ifndef __SPI_RX_H__
#define __SPI_RX_H__
#define uint unsigned int
#define uchar unsigned char
extern unsigned char SPI_Initial(void);
extern void SPI_Rx(void);
extern void SPI_RXLED(void);
#endif
主函数代码:
SPI_main.c:
#include "ioCC2530.h"
#include "SPI_Rx.h"
void main()
{
CLKCONCMD &= ~0x40;
while (CLKCONSTA & 0x40);
CLKCONCMD &= ~0x47;
SPI_Initial();
while(1)
{
SPI_Rx();
}
}
请问一下,怎么把以上代码放到z-stack协议栈里面去并实现控制LED1 LED2的功能?
我在SampleApp.c里面的SampleApp_Init( uint8 task_id )函数里面加入初始化函数:SPI_Initial();
然后想通过修改网蜂点对点通信的代码实现,然后就在SampleApp_ProcessEvent( uint8 task_id, uint16 events )函数里修改,在教程里面那个点对点发送函数 SampleApp_SendPointToPointMessage()之前添加一行代码: SPI_Rx();
小弟不才,初学zigbee,还望请论坛网友和网蜂的相关工程师帮忙指导一下。。毕竟网上没有看到什么z-stack关于SPI通信的内容。。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|