CC2530 的SPI通信中的问题和解决方法
2018-05-05 来源:eefocus
打算使用TI公司的CC2530控制TI的电压芯片DAC081S101,需要用到SPI模块。因为我的开发板只能测试UART1对应的IO口,因此做了下面的测试。
TI论坛提供的spi文档:
http://www.ti.com.cn/cn/lit/an/swra223a/swra223a.pdf
1. 两个CC2430测试,一个作为master,一个作为slave
代码完全使用TI 的SPI文档中的code,slave采用中断接收的方式,收到数据之后通过UART0发送到电脑上查看数据,完全正确。
注意事项:
*接线,非常重要。
Master的MOSI接Slave的MOSI; Master的MISO接Slave 的MISO;千万不要交叉接线,这个和UART通信不同。
*slave接收
中断接收和查询接收都没有问题,读缓存之前不需要向U1DBUF里写无效数据,这个应该只针对Master读数据的情况。
其他只要认真阅读文档就不会有问题的。
* Master发送数据注意延时
每发送完一个数据要做一定的延时,使得数据能完全移送到移位寄存器里面。
比如:
SSN0=LOW;
for(int i=0;i
U0DBUF=*pbuf;
pbuf++;
while(U0TX_BYTE==0);
Delay_ms(10);
U0CSR &= 0xFD;
}
SSN0=HIGH;
* 同时该测试说明一个问题,即两个相同电压的SPI模块是可以直连的。
2. CC2430控制DAC081S101
采用UART0作为Master控制数模转换芯片,选用备选引脚1.即p0_2,p0_3,p0_5为外设引脚,p_4为片选引脚。
初始化
MASTER:
PERCFG&=0xFE;
P0SEL|=0x2C; // P0_2,p0_3,p0_5 are peripherals, that is MISO,MOST,SCK .
P0SEL&=~0x10; //P0_4 is GPIO(SSN)
P0DIR|=0x10;//SSN is set as output
U0CSR &= ~0xA0; //SPI MAster Mode
U0BAUD = 0x3B;
U0GCR|=0x07;
U0GCR|=0xC0;// CPOL = CPHA = 1
U0GCR |= 0x20;
SLAVE:
P0SEL|=0x3C; //P0_2,p0_3,p0_4,p0_5 are peripherals
U0CSR &= ~0x80; //SPI mode
U0CSR |= 0x20; //slave mode
U0BAUD = 0x3B;
U0GCR|=0x07;
U0GCR|=0xC0;// CPOL = CPHA = 1
U0GCR |= 0x20;
TCON &= ~0x08;
URX0IE = 1;
EA=1;
发送:
for(int i=0;i
SSN0=LOW;
U0DBUF=0x32;
while(U0TX_BYTE==0);
Delay_ms(10);
U0CSR &= 0xFD;
SSN0=HIGH;
}
中断接收:
#pragma vector = URX0_VECTOR
__interrupt void HalSPISlave0IRQ(void)
{
TCON&=~0x08;
rxBufferSlave0[bufferIndex0++]=U0DBUF;
HalUARTWrite(HAL_UART_PORT_0, rxBufferSlave0, 10);
if(bufferIndex0==(RX_SlAVEBUFFER_NUMBER+1))
{
bufferIndex0=0;
for(int i=0;i
}
}