我利用MSP432P401R(MASTER)初始化ADS1299並嘗試讀取ID,但讀出來都是0x00,並且我再CODE裡面只有輸入5個byte的資料,卻跑出7個byte,我不知道發生什麼事
此圖為整體邏輯分析儀訊號圖,CH0為MOSI,CH1為MISO,CH2為CLOCK,CH3為DRDY,CS我讓他恆保持低態
以下3張圖為第一張圖的放大圖,從第一個byte依序往下
/* DriverLib Includes */
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
/* Standard Includes */
#include <stdint.h>
#include <stdbool.h>
#define HZ 3000000UL
/* Statics */
static volatile uint8_t RXData = 0;
static uint8_t TXData = 0;
uint8_t A = 0;
int main(void)
{
WDT_A->CTL = WDT_A_CTL_PW | // Stop watchdog timer
WDT_A_CTL_HOLD;
P1->SEL0 |= BIT5 | BIT6 | BIT7; // Set P1.5, P1.6, and P1.7 as
// SPI pins functionality
EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_SWRST; // Put eUSCI state machine in reset
EUSCI_B0->CTLW0 = EUSCI_B_CTLW0_SWRST | // Remain eUSCI state machine in reset
EUSCI_B_CTLW0_MST | // Set as SPI master
EUSCI_B_CTLW0_SYNC | // Set as synchronous mode
//EUSCI_B_CTLW0_CKPL | // Set clock polarity low
EUSCI_B_CTLW0_CKPH | //Phase high
EUSCI_B_CTLW0_MSB; // MSB first
EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_SSEL__ACLK; // ACLK
EUSCI_B0->BRW = 0x01; // /2,fBitClock = fBRCLK/(UCBRx+1).
EUSCI_B0->CTLW0 &= ~EUSCI_B_CTLW0_SWRST;// Initialize USCI state machine
// EUSCI_B0->IE |= EUSCI_B_IE_RXIE; // Enable USCI_B0 RX interrupt
/////////////////////////////////////////////////SPI INTERRUPT/////////////////////////////////////////////////////////////////////////////////
__enable_irq();
// Enable eUSCI_B0 interrupt in NVIC module
NVIC->ISER[0] = 1 << ((EUSCIB0_IRQn) & 31);
// Wake up on exit from ISR
SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk;
// Ensures SLEEPONEXIT takes effect immediately
__DSB();
P1->OUT &= ~BIT0;
P1->DIR |= BIT0; // Set P1.0 LED
P1->SEL0 |= BIT5 | BIT6 | BIT7; // Set P1.5, P1.6, and P1.7 as
// SPI pins functionality
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*TXData = 0x01; // Initialize TX data to 0x01
while(1)
{
TXData++;
spiTx(TXData);
spiRx ();
}*/
//CS_Low();
P3->DIR |= BIT0;
P3->OUT ^= BIT0; //CS_Low
__delay_cycles(HZ);
P3->DIR |= BIT5;
P3->OUT = BIT5; //CLKSEL High
__delay_cycles(HZ/1000);
P5->DIR |= BIT1;
P5->OUT = BIT1; //PWDN High
__delay_cycles(HZ);
P2->DIR |= BIT7;
P2->OUT = BIT7; //RESET High
__delay_cycles(HZ);
P2->DIR |= BIT7;
P2->OUT ^= BIT7; //RESET LOW
__delay_cycles(HZ);
P2->DIR |= BIT7;
P2->OUT = BIT7; //RESET High
__delay_cycles(HZ);
TXData = 0x11;//SDATAC
EUSCI_B0->IFG |= EUSCI_B_IFG_TXIFG;// Clear TXIFG flag
EUSCI_B0->IE |= EUSCI_B_IE_TXIE; // Enable TX interrupt
TXData = 0x12;//RDATA
EUSCI_B0->IFG |= EUSCI_B_IFG_TXIFG;// Clear TXIFG flag
EUSCI_B0->IE |= EUSCI_B_IE_TXIE; // Enable TX interrupt
P2->DIR |= BIT6;
P2->OUT |= BIT6; //Set Start High
A = spi_bmp183_read8(0x20);
}
uint8_t spi_bmp183_read8(uint8_t reg) {
// Make sure transmit buffer is clear
while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT)));
SPI_transmitData(EUSCI_B0_BASE, reg); // Transmit register address
__delay_cycles(HZ/1000);
// Send clock pulses. This will push slave to send data to master on MISO line.
SPI_transmitData(EUSCI_B0_BASE, 0x00);
__delay_cycles(HZ/1000);
SPI_transmitData(EUSCI_B0_BASE, 0x00);
__delay_cycles(HZ/1000);
// Make sure transmit buffer is clear
while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_RECEIVE_INTERRUPT)));
RXData = SPI_receiveData(EUSCI_B0_BASE); // Pick up received byte in SPI receive data register
return RXData;
}
void EUSCIB0_IRQHandler(void)
{
if (EUSCI_B0->IFG & EUSCI_B_IFG_TXIFG)
{
EUSCI_B0->TXBUF = TXData; // Transmit characters
__delay_cycles(HZ/1000);
//EUSCI_B0->TXBUF = 0x20; // Transmit characters
//__delay_cycles(HZ/100000);
//EUSCI_B0->TXBUF = 0x00; // Transmit characters
//__delay_cycles(HZ/100000);
EUSCI_B0->IE &= ~EUSCI_B__TXIE;
}
}




