工具/软件:Code Composer Studio
您好,
我的SPI函数有一些问题。
如果我检查了通信,则通信工作正常,所有字节数都在读取。
我的问题是保存此读取数据。
我尝试使用不同的函数读取和保存寄存器值,一个函数使用TDC7200的自动增量并将数据保存在数组(SPI_ReadAll_Reg())中,另一个函数只读一个寄存器,并进行位移操作(SPI_READ_longbyte())。
在这两个函数中,保存读数值似乎有相同的问题。
因为每次丢失最后一个值,RX缓冲区不会立即复制该值。 为什么RX缓冲器不立即复制值??? 我尝试了很多东西,如果 我用I<40编写for循环,我只能用SPI_ReadAll_Reg ()数据中的所有值[],但这会增加一个时钟周期。 (参见下图)
这种时钟周期(零读取值)使我的通信出现不必要的延迟,并且我的应用程序需要非常快速的通信
我的代码中出现了什么问题?? 它与TDC7200的SPI示例函数几乎相同!! 如何解决???? 请帮帮我。
#include <MSP4S.h>
#include <stdint.h>
#include
<stdlib.h>/**
* main.c
*/
void SPI_init(void);
void spi_write_config(uint8_t,uint8_t);
uint8_t spi_read_singlebyte(uint8_int_lut);uint_8_read_t_ut_lut)
UINT8_t数据[40];
UINT32_t wert;
int main (void)
{
uint8_t i;
WDTCTL = WDTPW | WDTHOLD; //停止监视计时器
SPI_init();
SPI_WRITE_CONFIG (0x40,0x03); //使用命令Meas Mode2/StartMeas Config1写入寄存器地址00h
SPI_write_config(0x41,0x40); //使用命令Single Stop/1 Measurement_cycle/ 10 Clock_周期Config1写入寄存器地址01h
wert = SPI_READ_longbyte(0x10); //只读一个具有位移的寄存器
SPI_ReadAll_Reg (0x90); // autocinc读取寄存器读取数组中的所有寄存器
(i = 0;i <= 39;I++)
{
printf("%x\n", data[i);}
printf ("%x\n",wert);
返回0;
}
void spI_write_config(uint8_t adress,uint8_t value)
{
P2OUT &=(~BIT2); //选择设备
while (!(UCB0IFG和UCTXIFG)); //等待TXBUF
UCB0TXBUF =地址; //发送地址以注册00h
while (!(UCB0IFG和UCTXIFG)); //等待TXBUF
UCB0TXBUF =值; //编写一个命令以注册00h
期间(UCB0STAT和UCBUSY); //等待TX完成
P2OUT |=(BIT2); //取消选择设备
}/*
uint8_t spi_read_singlebyte(uint8_t adress)
{
uINT8_t rcv;
P2OUT &=(~BIT2); //选择设备
while (!(UCB0IFG和UCTXIFG)); //等待TXBUF
UCB0TXBUF =地址; //发送地址以注册02h
while (!(UCB0IFG和UCTXIFG)); //等待TXBUF
UCB0TXBUF = 0; //虚拟写入以读取数据
while (!(UCB0IFG和UCRXIFG)); //等待RXBUF就绪
RCV = UCB0RXBUF;
期间(UCB0STAT和UCBUSY); //等待TX完成
P2OUT |=(BIT2); //取消选择设备
返回rcv;
}
*/
void SPI_ReadAll_Reg (uint8_t adress )
{
uint8_t I,a=0;
P2OUT &=(~BIT2); //
选择设备同时(!(UCB0IFG&UCTXIFG)); //等待TXBUF就绪
UCB0TXBUF =地址;
用于(i=0;i<39;i++) //如果I条件是ste到i<40,则我可以正确获取我的数据[]数组中的所有值,但还可以使用额外的时钟周期
{
同时(!(UCB0IFG&UCTXIFG)); //等待TXBUF就绪
UCB0TXBUF = 0; //虚拟写入,以便我们可以读取数据
while (!(UCB0IFG和UCRXIFG)); //等待RXBUF就绪
A = UCB0RXBUF;
数据[I]= A;
期间(UCB0STAT和UCBUSY); //等待RX完成
}
P2OUT |=(BIT2); //取消选择设备
}
UINT32_t SPI_READ_longbyte(uint8_t地址){
uINT32_t y = 0,x = 0;
P2OUT &=(~BIT2); //选择设备
while (!(UCB0IFG和UCTXIFG)); //等待TXBUF
UCB0TXBUF =地址; //发送地址以注册02h
while (!(UCB0IFG和UCTXIFG)); //等待TXBUF
UCB0TXBUF = 0; //虚拟写入以读取数据
while (!(UCB0IFG和UCRXIFG)); //等待RXBUF就绪
Y = UCB0RXBUF;
x |=(y <16);
while (!(UCB0IFG和UCTXIFG)); //等待TXBUF
UCB0TXBUF = 0; //虚拟写入以读取数据
while (!(UCB0IFG和UCRXIFG)); //等待RXBUF就绪
Y = UCB0RXBUF;
x |=(y << 8);
while (!(UCB0IFG和UCTXIFG)); //等待TXBUF
UCB0TXBUF = 0; //虚拟写入以读取数据
while (!(UCB0IFG和UCRXIFG)); //等待RXBUF就绪
Y = UCB0RXBUF;
x |= y;
期间(UCB0STAT和UCBUSY); //等待TX完成
P2OUT |=(BIT2); //取消选择设备
printf("%x\n",x);
return x;
}
void spi_init(void){/*
UCSCTL3 |= SELREF_2; //设置DCO FLL参考= REFO
UCSCTL4 |=拉美经济体系2; //设置ACLK = REFO
__bis_sr_register (SCG0); //禁用FLL控制回路
UCSCTL0 = 0x0000; //设置尽可能低的DCOx,MODx
UCSCTL1 = DCORSEL_5; //选择DCO范围24MHz操作
UCSCTL2 = FLLD_1 + 374; //将DCO乘数设置为12MHz
//(N + 1)* FLLRef = Fdco
//(374 + 1)* 3.2768万 = 12MHz
//设置FLL Div = fDCOCLK/2
__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 12 MHz / 3.2768万 Hz = 37.5万 = MCLK周期,以便DCO稳定下来
__DELAY周期(37.5万);
//循环,直到XT1,XT2和DCO故障标志被清除
做
{
UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + DCOFFG);
//清除XT2,XT1,DCO故障标志
SFRIFG1 &=~OFIFG; //清除故障标志
}同时(SFRIFG1&OFIFG); //测试振荡器故障标志
*////
启用PIN aktivieren für Register Zugriff//
P6OUT |=BIT5; //输出高使能引脚Aktiv
P6DIR |=BIT5; //用于TDC7200的输出启用引脚
// SPI引脚Auswählen //
P3SEL = BIT0 + BIT1 + BIT2;
P2OUT |= BIT2; // 2.2 设置芯片选择引脚高位
P2DIR || BIT2; // 2.2 Sippset as Chipselect
//配置为SPI-Register//
UCB0CTL1 |= UCSWRST; //启用statemachine
UCB0CTL1 |= UCSSEL_2;
UCB0CTL0 = UCMST+UCMSB+UCCKPH+UCSYNC;// SPI配置(MasterMode;SynchroneMode;Clock_Polarity;MSBfirstMode)
UCB0BR0 = 0x00; //预分频
器UCB0BR1 = 0;
UCA0MCTL = 0; // No Modulation
UCB0CTL1 &=~UCSWRST; //禁用软件重置
//UCB0IE |= UCRXIE; //启用USI_B0 RX中断
}
问候Ben
