This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好。 我在 MSP430F5529上工作的时间从几个月开始。 我的应用领域是使 MSP430F5529在主模式下运行、并以串行方式将24位数据传输到从器件(LMX2595)。 因此、我参考了资源浏览器中提供的示例代码、并根据我的应用进行了修改。 是否可以在下面找到任何代码、请告诉我需要进行的任何更正。
1) 1)如何检查数据是否传输到从器件、我是说如果没有从器件、我可以通过将控制器与 LCD 显示屏连接来检查数据。
2) 2)如何结合使用中断 LPMx 和 ISR 模式
3) 3)一旦数据被移位并加载到 TX 缓冲区中、我如何能够写入从器件中。 需要 Write 函数。
#include
#include
#include
void IOInitiate(void);
void SPI_MASTER_INITIATE (void);
//void SPI_write (unsigned char * data、unsigned char count);
无符号长整型寄存器;
unsigned int reg=79;
#define 虚拟0xFF
#define STE 1.
#define SIMO 2.
#define SOMI 3.
#define CLK 4.
#define CS_REG P2OUT
#define CS_BIT BIT7
#define SLAVE_CS_DIR P2DIR
#define SLAVE_CS_PIN BIT0
#define MAX_BUFFER_SIZE 10
typedef 枚举 SPI_ModeEnum{
IDLE_MODE、
TX_REG_ADDRESS_MODE、
RX_REG_ADDRESS_MODE、
TX_DATA_MODE、
RX_DATA_MODE、
TIMEOUT_MODE
} SPI_Mode;
SPI_Mode MasterMode = IDLE_MODE;
uint8_t TransmitRegAddr = 0;
uint8_t ReceiveBuffer[MAX_Buffer_SIZE]={0};
uint8_t RXByteCtr = 0;
uint8_t ReceiveIndex = 0;
uint8_t TransmitBuffer[MAX_Buffer_SIZE]={0};
uint8_t TXByteCtr = 0;
uint8_t TransmitIndex = 0;
unsigned char 计数;
void SPI_write (unsigned char *数据、unsigned char count)
{
静态 unsigned char cnt;
CS_REG &=~CS_BIT;
for (cnt=0;cnt < count;count++)
{
while (!(UCB0IFG & UCTXIFG));
UCB0TXBUF =数据[cnt];
}
while (UCB0STAT 和 UCBUSY);
CS_REG |= CS_BIT;
}
空 initClockTo16MHz()
{
UCSCTL3 |= SELREF_2;//设置 DCO FLL 基准= REFO
UCSCTL4 |= SELA_2;//设置 ACLK = REFO
_bis_SR_register (SCG0);//禁用 FLL 控制循环
UCSCTL0 = 0x0000;//设置可能的最低 DCOx、MODx
UCSCTL1 = DCORSEL_5;//选择 DCO 范围16MHz 运行
UCSCTL2 = FLLD_0 + 487;//将 DCO 乘法器设置为16MHz
//(N + 1)* FLLRef = Fdco
//(487 + 1)* 32768 = 16MHz
//设置 FLL Div = fDCOCLK
_BIC_SR_register (SCG0);//启用 FLL 控制环路
// DCO 范围位已经存在时、DCO 的最坏情况稳定时间
//已更改 n x 32 x 32 x f_MCLK / f_FLL_reference。 请参阅5xx 中的 UCS 一章
// UG 进行优化。
// 32 x 32 x 16 MHz/32、768Hz = 500000 = DCO 稳定的 MCLK 周期
_DELAY_CYCLES (50000);//
//循环直到 XT1、XT2和 DCO 故障标志被清除
操作
{
UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + DCOFFG);//清除 XT2、XT1、DCO 故障标志
SFRIFG1 &=~OFIFG;//清除故障标志
} while (SFRIFG1&OFIFG);//测试振荡器故障标志
}
空 initGPIO()
{
//LED
P1OUT = 0x00;//针对 LED 和复位输出设置 P1
P1DIR |= BIT0 + BIT5;
P4DIR |= BIT7;
P4OUT &=~(BIT7);
//SPI 引脚
P3SEL |= BIT3 + BIT4;// P3.3、4选项选择
P2SEL |= BIT7;// P2.7选项选择
//按钮启动传输
P1DIR &=~BIT1;//将 P1.1设置为输入方向
P1REN |= BIT1;//启用 P1.1内部电阻
P1OUT |= BIT1;//将 P1.1设置为上拉电阻
P1IES |= BIT1;// P1.1高/低边沿
P1IFG &=~BIT1;// P1.1 IFG 被清零
P1IE |= BIT1;// P1.1中断被启用
}
空 initSPI()
{
//时钟极性:无效状态为高电平
//MSB 优先、8位、主器件、3引脚模式、同步
UCA0CTL1 |= UCSWRST;//**将状态机置于复位状态**
UCA0CTL0 |= UCCKPL + UCMSB + UCMST + UCSYNC;
UCA0CTL1 |= UCSSEL_2;// SMCLK
UCA0BR0 |= 0x20;///2
UCA0BR1 = 0;//
UCA0MCTL = 0;// SPI 必须清除无调制
UCA0CTL1 &=~UCSWRST;//**初始化 USCI 状态机**
UCA0IE |= UCRXIE;//启用 USCI0 RX 中断
SLAVE_CS_DIR |= SLAVE_CS_PIN;
//slave_CS_out |= slave_CS_PIN;
}
unsigned int cnt = 0;
unsigned long register_values[79]={0x00251C、0x010808、0x020500、0x030642、0x040A43、0x0500C8、0x06C802、0x0740B2、
0x08200、0x091604、0x0A10D8、0x0B0018、0x0C5001、0x0D40、0x0E1E40、0x0F064F、
0x100080、0x11012C、0x120064、0x1327B7、0x14E048、0x15040、0x160001、0x17007C、
0x18071A、0x190C2B、0x1A0DB0、0x1B0003、0x1C0488、0x1D318C、0x1E318C、0x1F43EC、
0x200393、0x211E21、0x220000、0x230004、0x24002A、0x250404、0x26FFFF、0x27FFFA、
0x280000,0x290000,0x2A7FFF,0x2BFFF,0x2C0AE3,0x2DD0DF,0x2E07FD,0x2F0300,
0x300300、0x314180、0x320000、0x330080、0x340820、0x350000、0x360000、0x370000、
0x380000,0x3900200x3A8001,0x3B0001,0x3C0000,0x3D00A8,0x3E0322,0x3F0000,
0x401388、0x410000、0x4201F4、0x430000、0x4403E8、0x450000、0x46C350、0x470081、
0x480001、0x49003F、0x4A0000,0x4B0800,0x4C000C、0x4D0000,0x4E0003};
int main (空)
{
WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
P3SEL |= 0x18;
UCA0CTL1 |= UCSWRST;//**将状态机置于复位状态**
UCA0CTL0 |= UCCKPL + UCMSB + UCMST + UCSYNC;
UCA0CTL1 |= UCSSEL_2;// SMCLK
UCA0BR0 |= 0x20;///2
UCA0BR1 = 0;//
UCA0MCTL = 0;// SPI 必须清除无调制
UCA0CTL1 &=~UCSWRST;//**初始化 USCI 状态机**
UCA0IE |= UCRXIE;
//unsigned char 计数;
//unsigned int reg;
for (cnt=0;cnt < reg;cnt++)
{
while (!(UCB0IFG & UCTXIFG));
UCB0TXBUF = register_values[cnt]>16;
void SPI_write (unsigned char *数据、unsigned char count);
while (!(UCB0IFG & UCTXIFG));
UCB0TXBUF = register_values[cnt]>8;
void SPI_write (unsigned char *数据、unsigned char count);
while (!(UCB0IFG & UCTXIFG));
UCB0TXBUF = register_values[cnt];
void SPI_write (unsigned char *数据、unsigned char count);
}
//unsigned long registervalues;
//registerervalues=UCB0TXBUF;
}
我找不到足够的数据、我认为这是唯一可以帮助我的论坛。 请仔细阅读随附的代码、并在我时间不足时告知我如何纠正错误。
我们将非常感谢您的任何帮助。
您好、Singam、
让我快速回答您的问题。
1) 1)如何检查数据是否传输到从器件、我是说如果没有从器件、我可以通过将控制器与 LCD 显示屏连接来检查数据。
您可以通过示波器示波器来示波器上的 TX 引脚。 对于"LCD 显示屏"、我无法理解、您还应该有一个从器件来接收数据、并有一个 LCD 驱动器来驱动 LCD。
2) 2)如何结合使用中断 LPMx 和 ISR 模式
我对您的问题感到困惑。 ISR 代表中断服务例程。 请参阅 LPM 模式后中断的代码示例。
3) 3)一旦数据被移位并加载到 TX 缓冲区中、我如何能够写入从器件中。 需要 Write 函数。
数据加载到 TX 缓冲区后、将被传输到从器件。 不需要任何功能。 请参阅用户指南中的 UART 一章。
当您要求检查代码时、您应该分享您在运行代码时遇到的问题。