工具/软件:
尊敬的团队:
我们已 使用 SPI 通信将 PCM3168A (从器件)与 ADSPBF527 (主器件)连接。
从 MISO 线读取数据时遇到问题。
连接用于向 PCM3168A 写入数据和从 PCM3168A 读取数据的参考图像。
在0x40寄存器中写入0xC2值
C1:mosi
C2:CLK
C3:Cs.
C4:MISO
从0x40 (reg)| 0x80 (read)读取、但 MISO 为高电平
请查找以下代码、以供您使用 SPI 配置、写入和读取操作时参考。 要使其正常运行、我们是否需要考虑任何因素
#include
包含"adi_initialize.h"
#include "AudioCodecModule.h"
#include "CodecRdWr.h"
#include
#include
// SPI 设置
#define TIMOD_READ (0x00)
#define TIMOD_WRITE (0x01)
#define SPI_READ (0x01)
#define SPI_WRITE (0x00)
#define SPI_DELAY 2000
#define BAUD_DIV 20 //编解码器在5 MHz 下运行
#define WORD_SIZE16 (0x100)
#define SPI_SPIFPOLL 10000
#define SPI_SCK_PORTG_MUX (uint16_t)((uint16_t)((uint16_t) 0<<0))
#define SPI_MISO_PORTG_MUX (uint16_t)((uint16_t) 0<<0)
#define SPI_MOSI_PORTG_MUX ((uint16_t)((uint16_t) 0<<0)
#define SPI_SCK_PORTG_FER ((uint16_t)((uint16_t) 1<<2)
#define SPI_MISO_PORTG_FER ((uint16_t)((uint16_t) 1<<3)
#define SPI_MOSI_PORTG_FER ((uint16_t)((uint16_t) 1<<4)
void SPI_Enable (void);
void SPI_Write (uint8_t reg、uint8_t data);
void SPI_read (uint8_t reg);
void SPI_Disable (void);
int main (int argc、char *argv[])
{
/**
*初始化已添加到的托管驱动程序和/或服务
*项目。
*@成功时返回零
*/
int i = 0;
// Adi_initComponents ();
/* Portx_MUX 寄存器*/
*pPORTG_MUX = SPI_SCK_PORTG_MUX | SPI_MISO_PORTG_MUX
| SPI_MOSI_PORTG_MUX;
/* Portx_FER 寄存器*/
*pPORTG_FER = SPI_SCK_PORTG_FER | SPI_MISO_PORTG_FER
| SPI_MOSI_PORTG_FER;
*pPORTF_FER &=~PF7;// SPIO_SSEL1
*pPORTFIO_DIR |= PF7;
*pPORTFIO_CLEAR |= PF7;
对于(I = 0;I < 100;I++)
{
asm ("nop;");
}
*pPORTFIO_SET |= PF7;//以几毫秒的延迟使低电平到高电平转换
/*在此处开始添加您的自定义代码*/
SPI_Write (0x41、0x01);
SPI_READ (0x41);
返回0;
}
void SPI_Enable (void)
{
int i = 0;
*pPORTG_FER &=~PG1;// SPIO_SSEL1
* pPORTGIO_DIR |= PG1;
* pPORTGIO_SET |= PG1;
*pSPI_baud = baud_DIV;//20
*pSPI_CTL = SPE | MSTR | WORD_SIZE16 | TIMOD_WRITE; //CPHA //| WORD_SIZE16;
* pPORTGIO_CLEAR = PG1;//CS 低电平
对于(I = 0;I < 50;I++)
{
asm ("nop;");
}
}
静态 void SPI_Disable (void)
{
int i = 0;
* pPORTGIO_SET = PG1;//CS 高电平
*pSPI_CTL &= 0x0000;//禁用 SPI
*pSPI_FLG = 0x0000;
对于(I = 0;I < SPI_DELAY;I++)
{
asm ("nop;");
}
}
静态 bool Wait_For_(void)
{
int n;
unsigned short dummyread;
轮询的 INT = 0;
for (n=0;n < SPI_DELAY;n++)
{
asm ("nop;");
}
while (轮询< SPI_SPIFPOLL)
{
无符号短接 iTest =*pSPI_STAT;
IF((iTest & SPIF))
{
printf ("Break\n");
休息;
}
轮询++;
}
dummyread =*pSPI_RDBR;/*读取虚拟以启动数据传输*/
asm ("nop;");
asm ("nop;");
返回轮询< SPI_SPIFPOLL;
}
void SPI_Write (uint8_t reg、uint8_t data)
{//MOSI
uint8_t wrMask =(0x00 << 7);
uint16_t wrFrame =(uint16_t)(((wrMask | reg)<< 8)| data);
SPI_Enable ();
//等待 SPI TX 缓冲器为空
while (!SPIF(); Wait_For_
*pSPI_TDBR = wrFrame;
//等待 SPI 传输完成
while (!SPIF(); Wait_For_
SPI_Disable ();
printf ("W:0x%x -> 0x%x \n"、reg、data);
}
void SPI_READ (uint8_t reg)
{//MISO
uint8_t Rdata = 0;
uint8_t rdMask =(0x01 << 7);
uint16_t rdFrame =(uint16_t)(((rdMask | reg)<< 8)| 0x00);
SPI_Enable ();
//等待 SPI TX 缓冲器为空
while (!SPIF(); Wait_For_
*pSPI_TDBR = rdFrame;
//等待 SPI 传输完成
while (!SPIF(); Wait_For_
/*********** ReadData***************** /
RDATA =(uint8_t)(* pSPI_RDBR);
SPI_Disable ();
printf ("R:0x%x -> 0x%x \n"、reg、RDATA);
}
请支持我们解决这一问题、因为这是一个挑战、对该项目非常重要。
谢谢您、
S Lakshminarayanan Gokul