打算使用TI公司的CC2530控制TI的電壓芯片DAC081S101,需要用到SPI模塊。因為我的開發(fā)板只能測試UART1對應(yīng)的IO口,因此做了下面的測試。
TI論壇提供的spi文檔:
http://www.ti.com.cn/cn/lit/an/swra223a/swra223a.pdf
1. 兩個CC2430測試,一個作為master,一個作為slave
代碼完全使用TI 的SPI文檔中的code,slave采用中斷接收的方式,收到數(shù)據(jù)之后通過UART0發(fā)送到電腦上查看數(shù)據(jù),完全正確。
注意事項:
*接線,非常重要。
Master的MOSI接Slave的MOSI; Master的MISO接Slave 的MISO;千萬不要交叉接線,這個和UART通信不同。
*slave接收
中斷接收和查詢接收都沒有問題,讀緩存之前不需要向U1DBUF里寫無效數(shù)據(jù),這個應(yīng)該只針對Master讀數(shù)據(jù)的情況。
其他只要認真閱讀文檔就不會有問題的。
* Master發(fā)送數(shù)據(jù)注意延時
每發(fā)送完一個數(shù)據(jù)要做一定的延時,使得數(shù)據(jù)能完全移送到移位寄存器里面。
比如:
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控制數(shù)模轉(zhuǎn)換芯片,選用備選引腳1.即p0_2,p0_3,p0_5為外設(shè)引腳,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;
發(fā)送:
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
}
}