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.
尊敬的先生,
我正在研究 LMX2595和 MSP430F5529以生成17GHz 频率合成器。 现在、为了实现这一点、我需要使用从 TICS PRO 软件获得的值对微控制器进行编程。 我需要在主模式下操作控制器、并使用 SPI 协议将数据串行传输到从器件 LMX2595。 我已经知道 MSP430F5529具有79x 魔术常量。 现在、为了根据特定应用使用 LMX2595器件、我需要更改这些常量。
1) 1)如何访问这些79x 魔术常量并通过编程来改变它们?
2) 2)我无法在 MSP430F5529中找到采用这种存储器格式的寄存器、即1位 R?W、7位地址、16位数据
3一旦数据被传输到从器件、从器件必须向主器件确认、因为从器件(LMX2595)没有任何 MOSI 引脚。
4) 4)在下面的编程中、通道0的控制寄存器已经被使用了、我能否访问79x 魔术常量并改变这些值
在主控模式下操作 MSP430F5529来传输数据
#include MSP430器件的//头文件
void IOInitiate(void);
void SPI_MASTER_INITIATE (void);
void SPI_Tx (字符字节数据);
void main (void)
{
WDTCTL = WDTPW+WDTHOLD;//停止看门狗计时器
IOInitialate();//输入输出初始化
SPI_MASTER_INITIT();//主器件初始化
_bis_SR_register (GIE);//启用中断
//返回
char sed_to_='a';
while (1)
{
SPI_Tx (sed_to);//继续发送数据
}
}
空 IOInitialate (空)
{
P2DIR |= BIT7;//将 P1.0设置为 LED 的输出方向
P2OUT &=~BIT7;//默认为低电平
P3SEL |= BIT0+BIT1 + BIT2;// P3.0 UCA0SIMO // P3.1 UCA0SOMI // p3.2 clk
P2SEL |= BIT7;// CS
}
void SPI_MASTER_INITIATE (void)
{
UCB0CTL1 |= UCSWRST;//**将状态机置于复位状态**
UCB0CTL0 |= UCMST+UCSYNC+UCCKPL;//8位 SPI 主时钟极性高、MSB
UCB0CTL0 |= UCMODE_2;// 4引脚通信
UCB0CTL1 |= UCSSEL_2;// SMCLK //时钟选择
UCB0BR0 = 0x00;// SMCLK 速度除以1/***** 如果 UCBRx = 0、fBitClock = fBRCLK****
UCB0BR1 = 0;
UCA0MCTL = 0;//无调制
UCB0CTL1 &=~UCSWRST;//**初始化 USCI 状态机**
UCB0IE |= UCTXIE;//接收中断使能
}
空 SPI_Tx (字符字节数据)
{
P2OUT &=~BIT7;//低电平有效以进行启动通信
UCB0TXBUF =字节数据;//发送第一个字符
//if (UCB0TXBUF!=字节数据)
while (!(UCB0IFG&UCTXIFG));//保持直到传输完成
P2OUT |= BIT7;//用于终端通信的高电平有效
}
我是一个新手、时间不长。 我们非常感谢您的帮助。
提前感谢。
79x "魔术"常量是您在 TICS Pro 屏幕(R78、R77等)上看到的寄存器值。 (我想)您希望捕获这些值并将其作为数组插入 F5529程序。
我在右侧看到一个"Export"按钮、我怀疑该按钮将创建一个文本文件(以某种格式)、其中包含屏幕上的值。 您应该编辑"0x"常量、使它们看起来有点像:
unsigned long register_values[79]={//带有 SPI 前缀 0x4E0003的 LMX2595寄存器值、// R78 0x4D0000、// R77 0x4C000C、// R76 [...] };// register_values 的末尾[]
然后、在您的程序中具有如下内容:
void write_register (unsigned long value){ SPI_Tx ((value >> 16)& 0xFF);//寄存器编号+R/W SPI_Tx ((value >> 8)& 0xFF);//寄存器值高字节 SPI_Tx ((value >> 0)& 0xFF);//寄存器值低字节 }
然后在 main 中
对于(reg =0;reg < 79;++reg) WRITE_register (register_values[reg]);
我可能有一些细节不对(因为我没有任何此设备)、但我认为这是一般的想法。
主席先生,我已根据上述的改变实施,但我仍面对一些困难。 目前我没有 LaunchPad 套件、我遇到了一个错误、这是由于我定义了硬件引脚。 我已将已加载的数据传输到大小为79的数组中。 我不认为已经创建的存储器空间具有从1位 r/w、7位地址、16位数据开始的寄存器映射。
我随附以下代码、请告诉我必要的更改
#include
unsigned long register_values[79]
void SPI_Tx (字节数据值)
void IOInitiate(void);
void SPI_MASTER_INITIATE (void);
void write_register (无符号长整型值)
{
SPI_Tx (((value>>>16)& 0xFF);
SPI_Tx (((value>>>8)& 0xFF);
SPI_Tx (((value>>>0)和0xFF);
}
/**
* main.c
*
int main (空)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
IOInitialate();//输入输出初始化
SPI_MASTER_INITIT();//主器件初始化
_bis_SR_register (GIE);//启用中断
返回0;
}
void write_register (无符号长整型值)
无符号长整型 REGISTER_VALUE[79]={0x00251C、0x010808、0x2B500、0x040A43、0x0500C80、0x06C802、0x08200、0x09160、0x0A10D、0x0B00、0x0C500、0x0D400、0x0E1000、0x1000、0x1000、0x1000、0x1000、0x1000、0x1000、0x2、0x1000、0x1000、0x2、0x1000、0x2、0x1000、0x2、0x1000、0x2、0x1000、0x2、0x2、0x1000、0x2、0x1000、0x2、0x2、0x2、0x1000、0x2、0x2、0x1000、0x2、0x2、0x1000、0x2、0x2、0x2、0x2、0x2、0x2、0x2、0x2、0x1、0x2、0x1、0x1、0x2、0x2、0x2、0x2、0x2、0x1、0x2、0x2、0x2、0x1、0x2、0x2、0x2、0x2、0x1、0x1
空 IOInitialate (空)
{
P2DIR |= BIT7;//将 P2.0设置为输出
P2OUT &=~BIT7;//默认为低电平
P3SEL |= BIT0+BIT2;// P3.0 UCA0SIMO // p3.2 clk
P2SEL |= BIT7;// CS
}
void SPI_MASTER_INITIATE (void)
{
UCB0CTL1 |= UCSWRST;//**将状态机置于复位状态**
UCB0CTL0 |= UCMST+UCSYNC+UCCKPL;//8位 SPI 主时钟极性高、MSB
UCB0CTL0 |= UCMODE_2;// 4引脚通信
UCB0CTL1 |= UCSSEL_2;// SMCLK //时钟选择
UCB0BR0 = 0x00;// SMCLK 速度除以1/***** 如果 UCBRx = 0、fBitClock = fBRCLK****
UCB0BR1 = 0;
UCA0MCTL = 0;//无调制
UCB0CTL1 &=~UCSWRST;//**初始化 USCI 状态机**
UCB0IE |= UCTXIE;//接收中断使能
}
for (reg=0;reg<79;reg++)
{
WRITE_REGISTER (REGISTER_VALUES [REG])
}
提前感谢
您面临什么错误? 发布的此代码不会编译(for ()循环不在 main()中,有一些缺少的分号),但这些可能只是复制/粘贴错误。 修复这些问题后、在列表文件中 register_value[]数组看起来是正确的。
此外、如果您没有 Launchpad、您的 F5529芯片在哪里? 我在 EVM 上找不到一个;EVM 指南建议 USB2ANY 上可能有一个、但(几周前我看了)我没有找到该电路板的任何原理图、因此我不知道。 (在这里、我要提到的是、TI 商店的 F5529 Launchpad 售价为13美元、并且它已经发布了原理图。)
更一般地说:完成后、您希望获得什么? 您是否计划继续使用 EVM (可能适合实验室环境)、或者您是否打算构建一个定制电路板以部署在某些产品中?
----------------------
具体细节:
>P2SEL |= BIT7;// CS
> UCB0CTL0 |= UCMODE_2;// 4引脚通信
我想您需要3线(/CS 作为 GPIO)、即 UCMODE_0、并且不设置 P2SEL.7、因为您需要在多个字节上保持/CS 为低电平。
--
> UCB0IE |= UCTXIE;//接收中断使能
删除此行。 您没有设置任何 SPI 中断、也不想始终使用它们。
--
这是一个我不断发现自己在写作的函数。 它主要类似于您的(早期) SPI_Tx ()、但(a)您可以自由地混合发送和发送+接收事务(b)取消置位/CS (c)始终是安全的(对于您的快速 SPI)、它比中断更快(对于您的 SPI)。
uint8_t spix (uint8_t c) { while (!(UCB0IFG & UCTXIFG))/* empty*/; UCB0TXBUF = c; while (!(UCB0IFG & UCRXIFG)))/* empty*/; c = UCB0RXBUF; return (c)
实际上、我需要转储 MSP430F55229和更高版本中的代码、然后需要在项目中的哪个频率合成器的 PCB 板上生成代码。 我已订购 launchpad 套件、在这里我将测试代码。
1) 1)目前我面临致命错误、我认为这是由函数 SPI_Tx 引起的、我认为该函数是内置函数。
谨随函附上以下守则,请告知主席先生所需的改动。 主席先生,就我所知,我已达到这个水平,我是一位新手,请你仔细研究
#include
#include
#include
unsigned long register_values[79]
//void SPI_Tx (register_values[79])
//void IOInitiate(void);
//void SPI_MASTER_INITIATE (void)
int main (空)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
IOInitialate();//输入输出初始化
SPI_MASTER_INITIT();//主器件初始化
//_bis_SR_register (GIE);//启用中断
返回0;
unsigned long register_values[79]={0x00251C、0x010808、0x020500、0x030642、0x040A43、0x0500C8、0x06C802、0x0740B2、0x08200、0x091604、0x0A10D8、
0x0B0018、0x0C5001、0x0D4000、0x0E1E40、0x0F064F、0x100080、0x11012C、0x120064、0x1327B7、0x14E048、0x150401、
0x160001、0x17007C、0x18071A、0x190C2B、0x1A0DB0、0x1B0003、0x1C0488、0x1D318C、0x1E318C、0x1F43EC、0x200393、
0x211E21、0x220000、0x230004、0x24002A、0x250404、0x26FFFF、0x27FFFA、0x280000、0x290000、0x2A7FFF、0x2BFFFD、0x2C0AE3、
0x2DD0DF、0x2E07FD、0x2F0300、0x300300、0x314180、0x320000、0x330080、0x340820、0x350000、0x360000、0x370000、0x380000、
0x390020、0x3A8001、0x3B0001、0x3C000000、0x3D00A8、0x3E0322、0x3F000000、0x401388、0x4100000、0x4201F4、0x430000、0x4403E8、
0x450000,0x46C350,0x470081,0x480001,0x49003F,0x4A0000,0x4B0800,0x4C000C, 0x4D0000,0x4E0003};
unsigned long int reg;
for (reg=0;reg<79;reg++)
{
WRITE_REGISTER (REGISTER_VALUES [REG]);
void write_register (register_values[79]);
void SPI_Tx (char register_values[reg])
{
SPI_Tx ((char register_values[reg]>0)& 0xFF);//逐位和右移串行传输数据
SPI_Tx ((char register_values[reg]>8)& 0xFF);
SPI_Tx ((char register_values[reg]>16)& 0xFF);
}
}
uint8_t spix (uint8_t c)
{
while (!(UCB0IFG & UCTXIFG))
UCTXIFG = c;
while (!(UCB0IFG 和 UCRXIFG))
C = UCRXIFG;
返回(c);
}
}
空 IOInitialate (空)
{
P2DIR |= BIT7;//将 P2.0设置为输出
P2OUT &=~BIT7;//默认为低电平
P3SEL |= BIT0+BIT2;// P3.0 UCA0SIMO // p3.2 clk
P2SEL |= BIT7;// CS
}
void SPI_MASTER_INITIATE (void)
{
UCB0CTL1 |= UCSWRST;//**将状态机置于复位状态**
UCB0CTL0 |= UCMST+UCSYNC+UCCKPL+UCMSB;//8位 SPI 主时钟极性高、MSB
UCB0CTL0 |= UCMODE_2;// 4引脚通信
UCB0CTL1 |= UCSSEL_2;// SMCLK //时钟选择
UCB0BR0 = 0x00;// SMCLK 速度除以1/***** 如果 UCBRx = 0、fBitClock = fBRCLK****
UCB0BR1 = 0;
UCA0MCTL = 0;//无调制
UCB0CTL1 &=~UCSWRST;//**初始化 USCI 状态机**
//UCB0IE |= UCTXIE;//接收中断使能
}
主席先生,任何帮助都将不胜感激。
提前感谢、
此致
单岩市。
1) 1)我提供了 spix()来替代您(之前)的 SPI_Tx 函数。 您可以根据需要将名称更改为 SPI_Tx。
2) 2)您应该返回并重新复制我在上面发布的 spix()源,因为此源已被修改,因此它不起作用。
3) 3)我不建议使用 UCMODE_2、因为这不允许您进行多字节事务。 从代码中、您似乎已将/CS 连接到 P2.7。 我建议(a)使用 UCMODE_0 (b)删除行"P2SEL |= BIT7;"(c)在 WRITE_REGISTER 中、在开头添加"P2OUT &=~BIT7;"、在结尾添加"P2OUT |= BIT7;";这将在事务之前降低/CS 并在结束时升高/CS
这样、我想您就拥有了所需的组件、您只需将它们编辑成有效的 C 程序即可。
[编辑:更正了拼写错误。]