TI中文支持网
TI专业的中文技术问题搜集分享网站

cc2541透传,无法进入spi接收中断

各位大神好,在蓝牙透传这部分存在疑虑,现在做透传实验,其中主机是参考网上写的一段代码,包括读一个byte,写一个byte,从机是用TI协议栈BLE_Bridge_Patch。硬件上就是cs,clock,miso,mosi四个引脚分别对应连上。

问题就是,我一直让主机发0x33给从机,但是我发现从机并没有进入cSerialPacketParser函数,就是说并没有接收中断,想问下我是哪里没考虑对么?

下面是我主机程序,主机用的是模拟spi

#include <ioCC2541.h>

//宏定义
#define SPI_CS P1_4
#define SPI_CLK P1_5
#define SPI_MOSI P1_6
#define SPI_MISO P1_7

#define uint8 unsigned char

void SPI_DLY_ms(unsigned int ms)
{
unsigned int a;
while(ms)
{
a=1800;
while(a–);
ms–;
}
}

void SPI_DLY_us(unsigned int us)
{
unsigned int a;
while(us)
{
a=2;
while(a–);
us–;
}
return;
}

//引脚配置
void SPI_Init(void)
{
P1SEL &=0x0F;//将P1.4 P1.5 P1.6 P1.7设置为GPIO引脚 00001111
P1DIR |=0x70;//设置P1.4 P1.5 P1.6引脚为输出,P1.7为输入 01110000
}

//读字节函数
uint8 SPI_ReadByte(void)
{
unsigned char i=0,in=0,temp=0;
SPI_CS=0;
//先拉低,然后拉高的时候,读取MISO
SPI_CLK = 0;
for(i=0;i<8;i++)
{
in=(in<<1);
SPI_CLK = 1;
SPI_DLY_us(1);
temp = SPI_MISO;
if(temp==1)
{
in = in | 0x01;
}
SPI_CLK=0;
SPI_DLY_us(1);
}
SPI_CS=1;
return in;
}

//写字节函数
void SPI_SendByte(uint8 cmd)
{
unsigned char i=8,temp=0;
SPI_CS=0;
for(i=0;i<8;i++)
{
SPI_CLK=0;
temp = cmd&0x80;
if(temp==0)
{
SPI_MOSI = 0;
}
else
{
SPI_MOSI=1;
}
//cmd<<=1;
cmd=cmd<<1;
SPI_DLY_us(1);
SPI_CLK=1;
SPI_DLY_us(1);
}
SPI_MOSI=1;
SPI_CS=1;
}

void main(void)
{
SPI_Init();
while(1)
{
SPI_SendByte(0x33);
SPI_DLY_ms(1); }
}

用示波器抓图得到,其中蓝线是mosi,黄线是时钟,可以看出是按需求发送的0x33过去

希望大神能不吝赐教,谢谢!

da qin zheng sheng:

波特率需要一致,为啥不用硬件spi?另外串口也可以。

user5338514:

回复 Viki Shi:

感谢VIKI回答哈,后来我参考链接里面master send和BLE_Bridge_Patch里面对spi的设置,写了一个上位机程序,但是没成功,时钟和mo都没有输出,能帮我看下我哪里没有设置对么?十分感谢,下面是修改参考历程,修改内容是把p0口改为p1口

#include <hal_types.h>//字符类型头文件,eg:uint8/signed char/int8…#include <ioCC254x_bitdef.h>//看名字理解成,2541板子引脚的名称定义#include <ioCC2541.h>

#define SPI_CS P1_4#define SPI_CLK P1_5#define SPI_MOSI P1_6#define SPI_MISO P1_7

#define UCR_FLUSH 0x80

#ifndef BV#define BV(n) (1 << (n))#endif

#define P2DIR_PRIPO 0xC0#define HAL_UART_PRIPO 0x40 // USART1 priority over UART0.

//缓冲大小#define BUFFER_SIZE 100

//主机传送内容static uint8 txBufferMaster[BUFFER_SIZE];

void SPI_DLY_ms(unsigned int ms){ unsigned int a; while(ms) { a=1800; while(a–); ms–; }}

void main(void){ //设置系统时钟 CLKCONCMD = (CLKCONCMD & ~(CLKCON_OSC | CLKCON_CLKSPD)) | CLKCON_CLKSPD_32M; //等待时钟改变完成 while (CLKCONSTA & CLKCON_OSC); PERCFG |= 0x02; /* Set UART1 I/O to Alt. 2 location on P1 */ //设置中断优先级 P2DIR &= ~P2DIR_PRIPO; P2DIR |= HAL_UART_PRIPO; P1SEL &=0x0F;//将P1.4 P1.5 P1.6 P1.7设置为GPIO引脚 00001111 P1DIR |=0x70;//设置P1.4 P1.5 P1.6引脚为输出,P1.7为输入 01110000 U1CSR = 0; /* Mode is SPI-Master Mode */ U1GCR = 15; /* Cfg for the max Rx/Tx baud of 2-MHz */ U1BAUD = 255; U1UCR = UCR_FLUSH; /* Flush it */ U1GCR |= BV(5); /* Set bit order to MSB */ // Fill array with bytes to send. uint8 value = 0x00; int i; for (i = 0; i < BUFFER_SIZE; i++) { txBufferMaster[i] = value++; } while(1) { // Clear SSN, the SPI slave is active when SSN is low. //SPI_CS=0; for (i = 0; i < BUFFER_SIZE; i++) { // Write byte to USART1 buffer (transmit data). U1DBUF = txBufferMaster[i]; // Check if byte is transmitted. while(!(U1CSR & 0x02)); // Clear transmit byte status. U1CSR &= ~0x02; } // Set SSN, the SPI slave is inactive when SSN is high. //SPI_CS=1; SPI_DLY_ms(1); } }

user5338514:

回复 da qin zheng sheng:

感谢大秦正声回复,后面我又写了硬件spi的上位机程序(在回复viki里面有新的程序),但是配置好像有错,如果有空希望能帮我看下,十分感谢!

赞(0)
未经允许不得转载:TI中文支持网 » cc2541透传,无法进入spi接收中断
分享到: 更多 (0)