MSP432 SPI3线调试不成功

2019-07-17 14:11发布

在研究432的SPI时,先用的官网3线的收发例程。用的432A1做主机,B1做从机,连了个时钟,MISO和MOSI3根线,程序如下:#include "msp.h"
#include "driverlib/driverlib.h"
static uint8_t TXData = 0;
static volatile uint8_t RXData = 0;
static volatile uint8_t transmitData = 0x87, receiveData = 0x00;
const eUSCI_SPI_MasterConfig spiMasterConfig =
{
EUSCI_A_SPI_CLOCKSOURCE_SMCLK, // SMCLK Clock Source
3000000, // SMCLK = DCO = 3MHZ
3000000, // SPICLK = 500khz
EUSCI_A_SPI_MSB_FIRST, // MSB First
EUSCI_A_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT,
EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_HIGH,
EUSCI_SPI_3PIN
};
const eUSCI_SPI_SlaveConfig spiSlaveConfig =
{
EUSCI_B_SPI_MSB_FIRST, // MSB First
EUSCI_B_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT, // Phase
EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_HIGH, // Normal Polarity
EUSCI_SPI_3PIN
};
void main(void)
{
uint8_t aa=0,aaa=0;
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
//主机设置
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P2,
GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);
//从机设置
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P6,
GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5, GPIO_PRIMARY_MODULE_FUNCTION);
SPI_initMaster(EUSCI_A1_BASE, &spiMasterConfig);
SPI_initSlave(EUSCI_B1_BASE, &spiSlaveConfig);
SPI_enableModule(EUSCI_A1_BASE);
SPI_enableModule(EUSCI_B1_BASE);

SPI_enableInterrupt(EUSCI_B1_BASE, EUSCI_B_SPI_RECEIVE_INTERRUPT);
Interrupt_enableInterrupt(INT_EUSCIB1);
Interrupt_enableMaster();
TXData = 0x53;
while (!(SPI_getInterruptStatus(EUSCI_A1_BASE,EUSCI_A_SPI_TRANSMIT_INTERRUPT)));
SPI_transmitData(EUSCI_A1_BASE, TXData++);
while (!(SPI_getInterruptStatus(EUSCI_A1_BASE,EUSCI_A_SPI_RECEIVE_INTERRUPT)));
aa=SPI_receiveData(EUSCI_A1_BASE);
while (!(SPI_getInterruptStatus(EUSCI_A1_BASE,EUSCI_A_SPI_TRANSMIT_INTERRUPT)));
SPI_transmitData(EUSCI_A1_BASE, TXData);
while (!(SPI_getInterruptStatus(EUSCI_A1_BASE,EUSCI_A_SPI_RECEIVE_INTERRUPT)));
aaa=SPI_receiveData(EUSCI_A1_BASE);
while(1);
}
void EUSCIB1_IRQHandler(void)
{
uint32_t status;
status = SPI_getEnabledInterruptStatus(EUSCI_B1_BASE);
SPI_clearInterruptFlag(EUSCI_B1_BASE, status);
if(status & EUSCI_B_SPI_RECEIVE_INTERRUPT)
{
/* USCI_B1 TX buffer ready? */
while (!(SPI_getInterruptStatus(EUSCI_B1_BASE, EUSCI_B_SPI_TRANSMIT_INTERRUPT)));
/* Transmit data to master */
SPI_transmitData(EUSCI_B1_BASE, transmitData++);
//Receive data from master
receiveData = SPI_receiveData(EUSCI_B1_BASE);
}
}
中间绿 {MOD}那段是我测试的收发段,我的意图是主机发送一个字节,然后从机收到,进入从机接收中断;然后从机再给主机发送一个字节,主机收到。然后再循环一次。但是问题出现在第一次从中断返回的时候,进从机中断的时候可以收到主机发来的数据,但是在中断里由从机给主机发数据的时候,从机TXbuffer显示有发送,但是主机RXbuffer没有数据,然后aa赋值就为0(图1)。但是第二次进中断的时候,主机接收有了从机第一次发送的值(图2)(这个是延时吗?但是我等一好久,主机接收始终没有收到从机发送的第二个值,第二次的值应该是0x88)。 图1 图1 图2 图2

这我就不太明白了,明明我也加了接收寄存器判断的啊。不太懂,不知道有没有高人指点下,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
dirtwillfly
1楼-- · 2019-07-17 16:22
 精彩回答 2  元偷偷看……
ccczzzyyy
2楼-- · 2019-07-17 20:54
dirtwillfly 发表于 2017-6-13 08:22
这是主机的程序?建议先用串口助手调试一下再和从机调试。
觉得你的程序有些问题,就是你说绿 {MOD}的部分。用 ...

串口助手?串口是异步的,请问这个同步的该怎么测啊?
我再看看程序
dirtwillfly
3楼-- · 2019-07-17 23:48
ccczzzyyy 发表于 2017-6-13 09:50
串口助手?串口是异步的,请问这个同步的该怎么测啊?
我再看看程序

有spi转uart模块,就能用串口助手观察了
dirtwillfly
4楼-- · 2019-07-18 04:23
或者用逻辑分析仪观察也行的,看看哪里和预想的不同
ccczzzyyy
5楼-- · 2019-07-18 09:46
dirtwillfly 发表于 2017-6-13 14:23
有spi转uart模块,就能用串口助手观察了

我刚才看了看spi收发中断标志寄存器,发现点问题,发了个新帖,我觉得是我在这个贴里描述的问题的原因,您可以看看,中断寄存器有点问题。
firstblood
6楼-- · 2019-07-18 13:36
 精彩回答 2  元偷偷看……

一周热门 更多>