CC2543 SPI读不出数据

2019-07-21 20:20发布

本帖最后由 寒风晓月 于 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时序 HMC5983时序
说明 说明

将0xAA数据,写到U0DBUF,并延时的波形:
上面的是时钟,下面的是MOSI
32.png



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。