主题中讨论的其他器件: LDC1101
Hiiyyaa 论坛专家,
我为 LDC1101编写了一个基本 SPI 驱动程序。 因此、为了进行测试、我将尝试写入一个寄存器并从中读取。 但我遇到的问题是、它无法使 CS 引脚变为高电平、光标被吸入。 如果你能解决我的问题,我将对此表示感谢。 顺便说一下、我使用的是 MSP430FR5969开发板和 LDC1101。 那么、这是我的代码:
我将 USCIB0用于 SPI
///////////////////////////////////////////////////////////
#define SLAVE_CS_OUT P1OUT
#define SLAVE_CS_DIR P1DIR
#define SLAVE_CS_PIN BIT3
#define ENABLE_SPI_TX_INT () {UCB0IE |= UCTXIE;}
/*启用接收中断*/
#define ENABLE_SPI_RX_INT () {UCB0IE |= UCRXIE;}
/*禁用接收中断*/
#define DISABLE_SPI_RX_INT () {UCB0IE &=~UCRXIE;}
空 initClockTo8MHz()
{
//根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
//在配置时钟系统之前在8MHz 以上运行。
FRCTL0 = FRCTLPW | NWAITS_1;
//时钟系统设置
CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
CSCTL1 = DCORSEL | DCOFSEL_4; //将 DCO 设置为16MHz
CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;
CSCTL3 = DIVA__2 | DIVM__2; //设置所有分频器
CSCTL0_H = 0; //锁定 CS 寄存器
}
空 initGPIO()
{
//LED
P1OUT = 0x00; //针对 LED 和复位输出设置 P1
P1DIR |= BIT0 + BIT4;
P4DIR |= BIT6;
P4OUT &=~(BIT6);
P3DIR |= BIT4;
P3SEL1 |= BIT4; //输出 SMCLK
//配置 SPI 引脚
P2SEL1 |= BIT2; //clk
P1SEL1 |= BIT6 | BIT7; //配置 MISO/MOSI 引脚
SLAVE_CS_DIR |= SLAVE_CS_PIN; // STE 引脚
SLAVE_CS_OUT |= SLAVE_CS_PIN; // STE 引脚使能
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
}
空 WriteUCB0Data (uint8_t val)
{
while (!(UCB0IFG 和 UCTXIFG)); // USCI_B0 RX 缓冲区准备好了吗?
UCB0TXBUF = val;
}
SPI_Mode SPI_Master_WriteReg (uint8_t reg_addr、uint8_t reg_data、uint8_t count)
{
TransmitRegAddr = reg_addr;
TransmitBuffer = reg_data;
UCB0_TxComplete =真;
//将寄存器数据复制到 TransmitBuffer
//memcpy ((void *) TransmitBuffer、(const void *) reg_data、sizeof (reg_data));
TXByteCtr =计数;
ENABLE_CHIPSELECT ();
ENABLE_SPI_TX_INT ();
WriteUCB0Data (TransmitRegAddr);
_bis_SR_register (LPM0_bits + GIE); //输入 LPM0、带中断
while (UCB0_TxComplete!= true) //我的程序存根请帮助我解决此问题
disable_CHIPSELECT ();
返回 MasterMode;
}
SPI_Mode SPI_Master_ReadReg (uint8_t reg_addr、uint8_t count)
{
TransmitRegAddr = reg_addr;
RXByteCtr =计数;
TXByteCtr = 0;
ReceiveIndex = 0;
TransmitIndex = 0;
Slave_CS_OUT &=~(SLAVE_CS_PIN);
WriteUCB0Data (TransmitRegAddr);
_bis_SR_register (CPUOFF + GIE); //输入 LPM0、带中断
SLAVE_CS_OUT |= SLAVE_CS_PIN;
返回 MasterMode;
}
////////////////////////////////////////////////////////////////////////////////////////////////
int main (void){
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
initClockTo8MHz();
initGPIO();
initspi();
SPI_Master_WriteReg (RP_SET、0x45、WRITE_COUNT);
SPI_Master_ReadReg (RP_SET、READ_COUNT);
_bis_SR_register (LPM0_bits + GIE); // CPU 关闭、启用中断
/*
必须在此处添加用于电感式感应的逻辑
*
//while (1)
__no_operation();
返回0;
}
//////// SPI 中断//////////////
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=USCI_B0_vector
_interrupt void USCI_B0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCI_B0_vector)) USCI_B0_ISR (void)
其他
错误编译器不受支持!
#endif
{
uint8_t ucb0_rx_val = 0;
IF (((UCB0IE 和 UCTXIE)&&(UCB0IFG 和 UCTXIFG))
{
IF (TXByteCtr)
{
//WriteUCB0Data (TransmitBuffer[TransmitIndex++]);
WriteUCB0Data (TransmitBuffer);
TXByteCtr --;
}
其他
{
//传输完成
MasterMode = IDLE_MODE;
_BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出 LPM0
}
UCB0IFG &=~UCTXIFG; /*清除发送中断标志*/
UCB0_TxComplete =错误;
}
if (((UCB0IE 和 UCRXIE)&&(UCB0IFG 和 UCRXIFG)) //此处出现检查并显示残桩
{
IF (RXByteCtr)
{
ReceiveBuffer[ReceiveIndex++]= ucb0_Rx_val;
//发送虚拟
RXByteCtr---;
}
IF (RXByteCtr = 0)
{
MasterMode = IDLE_MODE;
_BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出 LPM0
}
其他
{
WriteUCB0Data (虚拟);
}
/*清除接收中断标志*/
UCB0IFG &=~UCRXIFG;
}
}
