您好!
我将 AFE4490与 Kinetis 微控制器连接。当我尝试从寄存器读回时、我将获得零数据。我看到了固件源代码和消息通信协议 pdf。在其中、他们提到使用数据包读取寄存器。能否有人解释我是否必须发送该数据 要通过 SPI 协议从寄存器读取 PCet、或者我必须发送整个数据包才能读回。我在写入寄存器时遇到同样的问题。任何人都会说这个过程。
提前感谢。
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.
我已经连接了 SPI 波形。首先我没有使用 ADC_rdy、PDN 和 RESET、只是我尝试使 SPI it.interfacing 与我的控制器一起工作、并在代码中写入1寄存器中使用 SPI_Read=0、然后使用 SPI_Read =1将其读回。这本身对我不起作用。我正在使用模式0和 4MHz。当我使用4MHz 时、我无法在逻辑分析仪中看到数据、因此我有固定的时钟。在数据表中、他们提到您必须使用4MHz 的顺序读取寄存器。所以、请澄清我要使用的时钟。我尝试写入的值不会写入寄存器。这会很好 如果已解决。谢谢。
/*
*文件:hello_world.c
*目的:主要过程
*
*
/*
该项目旨在使用 SPI 将 ADXL362与 K53n512控制器连接
协议
K53有3个 SPI 协议、我们使用的是 SPI0
*
#include "common.h"
#define GPIO_PIN_MASK 0x1FU
#define GPIO_PIN (x)(((1)<<(x 和 GPIO_PIN_MASK))
#define CONTROL0 0x00
#define LEDCNTRL 0x22
#define TIAGAIN 0x20
#define TIA_AMB_GAIN 0x21
//#define TEST_LOW GPIO_PDOR&=~GPIO_PDOR_PDO (GPIO_PIN (8))//调试引脚
//#define TEST_HIGH GPIO_PDOR|=GPIO_PDOR_PDO (GPIO_PIN (8))//调试引脚
/*函数原型*/
void SPI_init();
void SPI_write (uint8、uint32);
uint32 spi_read (uint8);
void time_delay_ms (unsigned int count_val);
uint8 SPI_byte_io (uint32数据);
void main (void)
{
printf ("\n 具有 afe 的 SPI 接口\n");
spi_init();
while (1)
{
SPI_WRITE (0x00、0x000000);
SPI_WRITE (0x20、0x000004);
SPI_WRITE (0x00、0x000001);
SPI_READ (0x20);
}
}
/*此处使用的 SPI 是主模式下的 SPI0、SPI 时钟禁用 FIFO、FIFO 的清零计数器、帧大小8、
波特率、上升沿上的时钟相位、非活动 STAS 高电平、使用 CTAR1、因为在主控模式下、MSB 优先、
打盹模式被禁用、连续时钟被激活
*
在主控模式中 void SPI_init ()//SPI 初始化
{
SIM_SCGC6 |= SIM_SCGC6_DSPI0_MASK;//启用 SPI0的时钟
SIM_SCGC5 =(SIM_SCGC5_PORta_mask)|(SIM_SCGC5_PORTB_mask);//启用到 Porta 的时钟
PORTA_PCR14 |= PORT_PCR_MUX (2);//将 SPI0功能(PCS0)的 MUX 值设置为2
//Porta_PCR15 &&=~PORT_PCR_MUX_MASK;
PORTA_PCR15 |= PORT_PCR_MUX (2);//为 SPI0功能(SCK)将 MUX 值设置为2
//Porta_PCR16 &&~PORT_PCR_MUX_MASK;
PORTA_PCR16 |= PORT_PCR_MUX (2);//为 SPI0功能(SOUT)将 MUX 值设置为2
// Porta_PCR17 &&=~PORT_PCR_MUX_MASK;
PORTA_PCR17 |= PORT_PCR_MUX (2);//为 SPI0功能(SIN)将 MUX 值设置为2
//主控模式、连续时钟生成、peri 芯片选择信号、当 Rx 数据溢出覆盖移位寄存器时、所有芯片选择使用高电平信号来停用、打盹模式被禁用、ENALbe DSPI 时钟一直并且不受外部数字引脚控制、TX 和 Rx 被启用
// SPI0_MCR =((SPI_MCR_HALT_MASK)|(SPI_MCR_MDI_MASK & 0x00);
// SPI0_MCR =(SPI_MCR_DIS_TXF_MASK)|(SPI_MCR_MSTR_MASK)|(SPI_MCR_DIS_RXF_MASK)|(SPI_MCR_ROOE_MASK)|(SPI_MCR_DCONF (0x00))|SPI_MCR_SCR_SIR_SCK_MASK (SPI_CONT_PCR_MASK)|(SPI_MCR_SCR_MASK);SPI_MCR_SPI_CK_SION
// SPI0_CTADR0 =(SPI_CTAR_DBR_MASK 和0x00)|(SPI_CTAR_FMSZ (0xF)|(SPI_CTAR_PDT (0x00))|(SPI_CTAR_BR (1))|(SPI_CTAR_CMSK (0x02)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR) 0X0X0_SCAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR) 0X0X0X0X0_CCAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|
SPI0_MCR =((SPI_MCR_HALT_MASK)|(SPI_MCR_MDI_MASK & 0x00));
SPI0_MCR =(SPI_MCR_DIS_TXF_MASK)|(SPI_MCR_MSTR_MASK)|(SPI_MCR_DIS_RXF_MASK)|(SPI_MCR_ROOE_MASK)|(SPI_MCR_DCONF (0x00))|SPI_MCR_SCK_SCKE_SIS_MASK (SPI_MOR_MASK)|(SPI_MCR_PCR63_MASK);(SPI_MCR_MCR_SI
SPI0_CTAR0 =(SPI_CTAR_DBR_MASK 和0x00)|(SPI_CTAR_FMSZ (0x07))|(SPI_CTAR_PDT (0x00)|(SPI_CTAR_BR (0x07))|(SPI_CTAR_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR) 0X0X0_PCAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR) 0X0X0X0X0_PCAR)|(SPI_CTAR (SPI_CTAR)|(SPI_CTAR)|(SPI_CTAR)(SPI_CTAR)|(SPI_CTAR
}
// SPI0_PUSHR |=(SPI_PUSHR_PCS (0<0));
// SPI0_MCR &= 0xfffffffe;//重新开始传输
/*函数 memory_write()一次将数据写入内存一个字节*/
/*void SPI_write (uint8地址、uint32数据)
{
SIM_SCGC6 |=SIM_SCGC6_DSPI0_MASK;
uint8 d1、d2、d3;
uint8 du1、d2、d3、du4 = 0;
D3=((DATA>>>16)&(0x0000FF);
D2=((DATA>>>8)&(0x0000FF));
D1=(DATA & 0x0000FF);
//test_low;
SPI0_PUSHR =((SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (63))|(SPI_PUSHR_CONT_MASK)| SPI_PUSHR_TXDATA (地址);
while ((((SPI0_SR & SPI_SR_TCF_MASK)= 0));
DU1=SPI0_popr;
SPI0_SR |= SPI_SR_TCF_MASK;
SPI0_SR |= SPI_SR_TFFF_MASK;
printf ("发送地址时为虚拟:%x\n"、du1);
//data3.
SPI0_PUSHR =((SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (63))|(SPI_PUSHR_CONT_MASK)| SPI_PUSHR_TXDATA (D3);
while ((((SPI0_SR & SPI_SR_TCF_MASK)= 0));
DU2=SPI0_popr;
SPI0_SR |= SPI_SR_TCF_MASK;
SPI0_SR |= SPI_SR_TFFF_MASK;
printf ("发送 MSB 时为虚拟:%x\n"、du2);
//data2.
SPI0_PUSHR =((SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (63))|(SPI_PUSHR_CONT_MASK)| SPI_PUSHR_TXDATA (D2);
while ((((SPI0_SR & SPI_SR_TCF_MASK)= 0));
dut3=SPI0_popr;
SPI0_SR |= SPI_SR_TCF_MASK;
SPI0_SR |= SPI_SR_TFFF_MASK;
printf ("中间发送时为虚拟:%x\n"、du3);
//data1
SPI0_PUSHR =(SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (63))|(SPI_PUSHR_CONT_MASK_0x00)|(SPI_PUSHR_EOQ_MASK)|(SPI_PUSHR_TXDATA (D1));
while ((((SPI0_SR & SPI_SR_TCF_MASK)= 0));
DU4=SPI0_popr;
SPI0_SR |= SPI_SR_TCF_MASK;
SPI0_SR |= SPI_SR_TFFF_MASK;
printf ("发送 lsb 时为虚拟:%x\n"、du4);
//test_high;
printf ("写入 Addrs %x:%x\n"、地址、数据);
}*/
/*function memory_read()从内存中一次读取一个字节的数据*/
/*uint32 SPI_read (uint8地址)
{
uint8 RD1=0、RD2=0、读数3=0;
无符号长整型返回值=0;
//test_low;
//地址
SPI0_PUSHR =((SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (63))|(SPI_PUSHR_CONT_MASK)| SPI_PUSHR_TXDATA (地址);
while ((((SPI_SR_RFDF_MASK & SPI0_SR)= 0));
SPI0_SR |= SPI_SR_RFDF_MASK;
SPI0_SR |= SPI_SR_RFIF_MASK;
//data3.
SPI0_PUSHR =((SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (63))|(SPI_PUSHR_CONT_MASK)|SPI_PUSHR_TXDATA (0x00));
while ((((SPI_SR_RFDF_MASK & SPI0_SR)= 0));
RD1=SPI0_popr;
SPI0_SR |= SPI_SR_RFDF_MASK;
SPI0_SR |= SPI_SR_RFIF_MASK;
printf ("data3:%x\n"、RD1);
SPI0_PUSHR =((SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (63))|(SPI_PUSHR_CONT_MASK)|SPI_PUSHR_TXDATA (0x00));
while ((((SPI_SR_RFDF_MASK & SPI0_SR)= 0));
RD2=SPI0_popr;
SPI0_SR |= SPI_SR_RFDF_MASK;
SPI0_SR |= SPI_SR_RFIF_MASK;
printf ("data2:%x\n"、RD2);
SPI0_PUSHR =((SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (63))|(SPI_PUSHR_EOQ_MASK)|(SPI_PUSHR_CONT_MASK 和0x00)| SPI_PUSHR_TXDATA (0x00);
while ((((SPI_SR_RFDF_MASK & SPI0_SR)= 0));
rd3=SPI0_popr;
SPI0_SR |= SPI_SR_RFDF_MASK;
SPI0_SR |= SPI_SR_RFIF_MASK;
printf ("data1:%x\n"、rd3);
//test_high;
RetVal|= RD1;
RetVal =((RetVal << 8)|RD2);
RetVal =((RetVal <<8)|rd3);
printf ("从 Addr 读取的数据:%x\n"、RetVal);
返回 RetVal;
}*/
/*使用 LPTMR 模块的延迟功能*/
void time_delay_ms (unsigned int count_val)
{
SIM_SCGC5|=SIM_SCGC5_LPTIMER_MASK;//打开 LPTMR 模块的时钟
LPTMR0_CMR = COUNT_val;//设置比较值
LPTMR0_PSR = LPTMR_PSR_PCS (1)|LPTMR_PSR_PBYP_MASK;//使用1kHz LPO 时钟和旁路预分频器
LPTMR0_CSR |= LPTMR_CSR_TED_MASK;//开始计数
while (!(LPTMR0_CSR 和 LPTMR_CSR_TCF_MASK)){}//等待计数器达到比较值
LPTMR0_CSR &&~LPTMR_CSR_TED_MASK;//清除计时器比较标志
返回;
}
//由于您显然不关心时间效率,因此将基本字节 I/O 放入一个小程序中会有所帮助:
/*uint8 SPI_byte_io (uint32 data){
uint8评估;
SPI0_PUSHR =数据;
// while (!(!(SPI0_SR & SPI_SR_TFFF_MASK)){}//您不需要在 TX-Empty 上旋转
//因为 RX 已满将始终"一位后"
while (!(SPI0_SR & SPI_SR_RFDF_MASK)){}//等待 RX FIFO 不为空
// while (!(!(SPI0_SR & SPI_SR_EOQF_MASK)){}//无意义...
RetVal = SPI0_popr;
// SPI0_SR = SPI_SR_EOQF_MASK;//清除 EOQF 标志
SPI0_SR = SPI_SR_TFFF_MASK;
SPI0_SR = SPI_SR_RFDF_MASK;
返回评估;
}
void SPI_write (uint8 MSTR_val、uint32 data){
// SIM_SCGC6 |=SIM_SCGC6_DSPI0_MASK;//目前不需要!
uint8 d1、d2、d3;
uint8 dummy_rx=0;
uint32 chk_data=0;
D3=((DATA>>>16)&(0x0000FF);
D2=((DATA>>>8)&(0x0000FF));
D1=(DATA & 0x0000FF);
虚拟 Rx = SPI_BYTE_IO ((SPI_PUSHR_TXDATA (MSTR_Val))| SPI_PUSHR_CONT_MASK | SPI_PUSHR_PCS (0x01));
虚拟 Rx = SPI_BYTE_IO ((SPI_PUSHR_TXDATA (D3))| SPI_PUSHR_CONT_MASK | SPI_PUSHR_PCS (0x01));
虚拟 Rx = SPI_BYTE_IO ((SPI_PUSHR_TXDATA (D2))| SPI_PUSHR_CONT_MASK | SPI_PUSHR_PCS (0x01));
虚拟 Rx = SPI_BYTE_IO ((SPI_PUSHR_TXDATA (D1)))|(SPI_PUSHR_CONT_MASK_0x00)| SPI_PUSHR_PCS (0x01));
chk_data=(D3<<16)|(D2<8)|D1;
printf ("写入 Addrs 的数据:%x\n"、chk_data);
}
uint32 SPI_read (uint8地址){
// SIM_SCGC6 |=SIM_SCGC6_DSPI0_MASK;//目前不需要!
uint8 d1、d2、d3;
uint8 dummy_rx=0;
uint32 chk_data=0;
// D3=((data>>16)&(0x0000FF);
// d2=((data>>8)&(0x0000FF));
//D1=(DATA & 0x0000FF);
虚拟 Rx = SPI_BYTE_IO ((SPI_PUSHR_TXDATA (地址))| SPI_PUSHR_CONT_MASK | SPI_PUSHR_PCS (0x01));
D3= SPI_BYTE_IO ((SPI_PUSHR_TXDATA (0))| SPI_PUSHR_CONT_MASK | SPI_PUSHR_PCS (0x01));
D2 = SPI_BYTE_IO ((SPI_PUSHR_TXDATA (0))| SPI_PUSHR_CONT_MASK | SPI_PUSHR_PCS (0x01));
D1 = SPI_BYTE_IO ((SPI_PUSHR_TXDATA (0)))|(SPI_PUSHR_CONT_MASK_0x00)| SPI_PUSHR_PCS (0x01));
chk_data=((D3&0x3F)<<16)|(D2<8)|D1;
printf ("从 Addr 读取的数据:%x\n"、chk_data);
返回 chk_data;
}*/
空 SPI_WRITE (uint8地址、uint32数据)
{
SIM_SCGC6 |=SIM_SCGC6_DSPI0_MASK;
uint8 d1、d2、d3;
uint8 du1、d2、d3、du4 = 0;
D3=((DATA>>>16)&(0x0000FF);
D2=((DATA>>>8)&(0x0000FF));
D1=(DATA & 0x0000FF);
SPI0_PUSHR =((SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (63))|(SPI_PUSHR_CONT_MASK)| SPI_PUSHR_TXDATA (地址);
while ((((SPI0_SR & SPI_SR_TCF_MASK)= 0));
while ((((SPI_SR_RFDF_MASK & SPI0_SR)= 0));
SPI0_SR |= SPI_SR_RFDF_MASK;
SPI0_SR |= SPI_SR_RFIF_MASK;
SPI0_SR |= SPI_SR_TCF_MASK;
SPI0_SR |= SPI_SR_TFFF_MASK;
SPI0_PUSHR =((SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (63))|(SPI_PUSHR_CONT_MASK)| SPI_PUSHR_TXDATA (D3);
while ((((SPI0_SR & SPI_SR_TCF_MASK)= 0));
while ((((SPI_SR_RFDF_MASK & SPI0_SR)= 0));
SPI0_SR |= SPI_SR_RFDF_MASK;
SPI0_SR |= SPI_SR_RFIF_MASK;
SPI0_SR |= SPI_SR_TCF_MASK;
SPI0_SR |= SPI_SR_TFFF_MASK;
SPI0_PUSHR =((SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (63))|(SPI_PUSHR_CONT_MASK)| SPI_PUSHR_TXDATA (D2);
while ((((SPI0_SR & SPI_SR_TCF_MASK)= 0));
while ((((SPI_SR_RFDF_MASK & SPI0_SR)= 0));
SPI0_SR |= SPI_SR_RFDF_MASK;
SPI0_SR |= SPI_SR_RFIF_MASK;
SPI0_SR |= SPI_SR_TCF_MASK;
SPI0_SR |= SPI_SR_TFFF_MASK;
SPI0_PUSHR =((SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (0x00))|(SPI_PUSHR_CONT_MASK & 0x00)|(SPI_PUSHR_EOQ_MASK)| SPI_PUSHR_TXDATA (D1);
while ((((SPI0_SR & SPI_SR_TCF_MASK)= 0));
while ((((SPI_SR_RFDF_MASK & SPI0_SR)= 0));
SPI0_SR |= SPI_SR_RFDF_MASK;
SPI0_SR |= SPI_SR_RFIF_MASK;
SPI0_SR |= SPI_SR_TCF_MASK;
SPI0_SR |= SPI_SR_TFFF_MASK;
printf ("向 Addrs 写入数据:%x\n"、data);
}
/*function memory_read()从内存中一次读取一个字节的数据*/
uint32 SPI_read (uint8地址)
{
SIM_SCGC6 |=SIM_SCGC6_DSPI0_MASK;
uint8 RD1=0、RD2=0、读数3=0;
无符号长整型返回值=0;
SPI0_PUSHR =((SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (63))|(SPI_PUSHR_CONT_MASK)| SPI_PUSHR_TXDATA (地址);
while ((((SPI0_SR & SPI_SR_TCF_MASK)= 0));
while ((((SPI_SR_RFDF_MASK & SPI0_SR)= 0));
SPI0_SR |= SPI_SR_RFDF_MASK;
SPI0_SR |= SPI_SR_RFIF_MASK;
SPI0_SR |= SPI_SR_TCF_MASK;
SPI0_SR |= SPI_SR_TFFF_MASK;
printf ("从 MSB 读取的数据:%x\n"、rd3);
SPI0_PUSHR =((SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (63))|(SPI_PUSHR_CONT_MASK)| SPI_PUSHR_TXDATA (0x00));
while ((((SPI0_SR & SPI_SR_TCF_MASK)= 0));
while ((((SPI_SR_RFDF_MASK & SPI0_SR)= 0));
rd3=SPI0_popr;
SPI0_SR|= SPI_SR_RFDF_MASK;
SPI0_SR|= SPI_SR_RFIF_MASK;
SPI0_SR|= SPI_SR_TCF_MASK;
SPI0_SR|= SPI_SR_TFFF_MASK;
printf ("中间读取的数据:%x\n"、RD2);
SPI0_PUSHR =((SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (63))|(SPI_PUSHR_CONT_MASK)| SPI_PUSHR_TXDATA (0x00));
while ((((SPI0_SR & SPI_SR_TCF_MASK)= 0));
while ((((SPI_SR_RFDF_MASK & SPI0_SR)= 0));
RD2=SPI0_popr;
SPI0_SR |= SPI_SR_RFDF_MASK;
SPI0_SR |= SPI_SR_RFIF_MASK;
SPI0_SR |= SPI_SR_TCF_MASK;
SPI0_SR |= SPI_SR_TFFF_MASK;
printf ("数据读取框架 lsb:%x\n"、RD1);
SPI0_PUSHR =((SPI_PUSHR_CTA (0x00))|(SPI_PUSHR_PCS (0x00))|(SPI_PUSHR_EOQ_MASK)|(SPI_PUSHR_CONT_MASK & 0x00)| SPI_PUSHR_TXDATA (0x00);
while ((((SPI0_SR & SPI_SR_TCF_MASK)= 0));
while ((((SPI_SR_RFDF_MASK & SPI0_SR)= 0));
RD1=SPI0_popr;
SPI0_SR |= SPI_SR_RFDF_MASK;
SPI0_SR |= SPI_SR_RFIF_MASK;
SPI0_SR |= SPI_SR_TCF_MASK;
SPI0_SR |= SPI_SR_TFFF_MASK;
RetVal|= RD1;
RetVal =((RetVal << 8)|RD2);
RetVal =((RetVal <<8)|rd3);
printf ("从 Addr 读取的数据:%x\n"、RetVal);
返回 RetVal;
}
寄存器、我对其进行了更改并尝试读取