本帖最后由 寒风晓月 于 2016-1-5 19:13 编辑
主:CC2543,从:HMC5983磁传感器,CC2543是8051核的,和CC2530、CC2430等51核的器件的SPI口使用方式是相同的。
发数据,CLK和MOSI的波形是正确的,SSN使能高低电平也是正确的,但是读数据,一个板子读到的是0xFF,其他板子读到的都是0x00。
根据网上的一些信息,说要先写一个无效命令,将从器件寄存器的值取回来,也试过,但是不可以。时钟的相位和极性也改过,但是没有返回的数据。
希望有经验的各位,能指导一下。
程序:
void spiInit(void)
{
/***************************************************************************
* Setup I/O ports
* Port and pins used by USART0 operating in SPI-mode are
* MISO (MI): P1_3
* MOSI (MO): P1_4
* SSN (SS) : P1_1
* SCK (C) : P1_2
*/
// Configure USART0 for Alternative 1 => Port P0 (PERCFG.U0CFG = 0).
// Give priority to USART 0 over Timer 1 for port 0 pins.
PERCFG = (PERCFG & ~PERCFG_U0CFG) | PERCFG_U0CFG_ALT2;
PPRI &= ~PPRI_PRI0P1;
P1SEL = (P1SEL & ~BIT1) | BIT2 | BIT3 | BIT4;
P1DIR |= BIT1;
U0BAUD = 216;
U0GCR |= 10;
U0CSR &= ~(U0CSR_MODE | U0CSR_SLAVE);
U0GCR |= 0x80; //CPOL=1;
//U0GCR &= ~ 0x80; //CPOL=0;
U0GCR |= 0x40; //CPHA=1;
//U0GCR &= ~ 0x40; //CPHA=0;
U0GCR |= 0x20; //MSB
//U0GCR &= ~ 0x20; //LSB
}
void sendByte(int8 data)
{
U0DBUF = data;
while(!(U0CSR & U0CSR_TX_BYTE));
U0CSR &= ~U0CSR_TX_BYTE;
// data = U0DBUF;
// data = U0DBUF;
}
int8 receiveByte(int8 dummyData)
{
int8 data;
U0DBUF = dummyData;
while(!(U0CSR & U0CSR_TX_BYTE));
U0CSR &= ~U0CSR_TX_BYTE;
data = U0DBUF;
return data;
}
void main(void)
{
int8 data;
CLKCONCMD = (CLKCONCMD & ~(CLKCON_OSC | CLKCON_CLKSPD)) | CLKCON_CLKSPD_32M;
while (CLKCONSTA & CLKCON_OSC); // Wait until clock source has changed
spiInit();
while(1)
{
P1_1 = 0;
sendByte(0x81);
data = receiveByte(0xFF);
P1_1 =1;
halMcuWaitMs(1);
}
}
HMC5983关于SPI的时序:
HMC5983时序
说明
将0xAA数据,写到U0DBUF,并延时的波形:
上面的是时钟,下面的是MOSI
:dizzy: 时钟和MOSI是正确的,MISO就一直是低电平
有两个可能:
1、硬件问题,检查硬件连接和相关电路
2、时序问题,主机发送时序有问题,从机没给你回复信息
外部晶振,32MHz,SPI的波特率设置成了57600,用示波器测过,大概周期17us,是对的。HMC5983从器件最大SPI速率是8000KHz,我也换过其他波特率,也不行。
一周热门 更多>