主题中讨论的其他部件:MSP430FR5994
我正在尝试将DMA的使用与MSP-EXP430FR5994-BQ79600EVM SPI7.96万 SPI结合起来。 尽管BQ7.96万以2MHz时钟运行,但我发现需要使用SPI Rx中断来成功自动寻址。 希望使用DMA而不是Rx中断,这是MSP430压力较小的设置。 我使用此线程的内容开始的字节:
MSP430FR5994:DMA不由I2C中断触发- MSP低功耗微控制器论坛- MSP低功耗微控制器- TI E2E支持论坛
以下是我的初步问题:
- 我是否可以将DMA通道3设置为仅在UCB1RXIFG上触发? UCB1TXIFG是否使用DMA,或者由于选择触发器,只能通过DMA接收SPI? 我在下面粘贴了SPI_Init,SPI传输和SPI接收函数。 DMA3SZ 1的值是否正确? 还是必须与块大小相同?
- DMA3SZ 1的值是否正确? 还是必须与块大小相同?
- DMA3SZ 1的值是否正确? 还是必须与块大小相同?
- 我不了解使用DMA_Value的目的或方法。
- 如果DMA_Init中的其它内容不是很好,请告诉我。
谢谢
void DMA_Init(){
(uintptr_t) &DMA3SA = (uintptr_t) &UCB1RXBUF;
(uintptr_t) &DMA3DA = (uintptr_t) &dma_value;
DMA3CTL &= ~DMAEN;
DMACTL1 |= DMA3TSEL__UCB1RXIFG;
DMA3CTL |= DMAARMDIS;
DMA3CTL &= ~DMA3CTL;
DMA3SZ = 1;
DMA3CTL |= DMADT_4|DMADSTINCR_3|DMASRCINCR_0|DMASRCBYTE__BYTE|DMADSTBYTE__BYTE|DMA_TRIGGER_RISINGEDGE|DMAEN;
}
void SPI_Init()
{
//BQ79600 SPI1_B1
UCB1CTLW0 = UCSWRST; // **Put state machine in reset**
UCB1CTLW0 |= UCCKPH | UCCKPL_0 | UCMSB | UCSYNC
| UCMST | UCSSEL__SMCLK; // 3-pin, 8-bit MAB SPI master SMCLK=1M
UCB1BRW = 0x00; //UCB1CLK=SMCLK=1M
UCB1CTLW0 &= ~UCSWRST; // **Initialize USCI state machine**
}
void spiTransmitData(uint32_t blocksize)
{
TransmitIndex=0;
P4OUT = ~BIT4;
while(blocksize != 0U)
{
UCB1TXBUF=spiFrame[TransmitIndex];
while((UCB1STAT&UCBUSY));
dummy=UCB1RXBUF;
TransmitIndex++;
blocksize--;
}
P4OUT = BIT4;
return;
}
void spiTransmitAndReceiveData(uint32_t blocksize,uint16_t * destbuff)
{
ReceiveIndex = 0;
P4OUT &= ~BIT4;
while(blocksize != 0U)
{
UCB1TXBUF=dummy;
while((UCB1STAT&UCBUSY));
destbuff[ReceiveIndex]=UCB1RXBUF;
ReceiveIndex++;
blocksize--;
}
P4OUT |= BIT4;
return;
}