程序:
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#define CS_ GpioDataRegs.GPBDAT.bit.GPIO49 //定义IO49为片选输出信号
void delay_loop(void);
void spi_xmit(Uint16 a);
void spi_fifo_init(void);
void spi_init(void);
void error(void);
Uint16 j,i,k;
void main(void)
{
Uint16 rdata; // received data
InitSysCtrl();
InitXintf16Gpio(); //zq
InitSpiaGpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
spi_fifo_init(); // Initialize the Spi FIFO
spi_init(); // init SPI
CS_=1; //片选拉高
delay_loop();
CS_=0; //片选拉低
delay_loop();
spi_xmit(0x04); //发送软件复位操作码
delay_loop();
CS_=1;
delay_loop();
CS_=0;
delay_loop();
spi_xmit(0x10);
spi_xmit(0x01); //写接收器1控制寄存器
delay_loop();
CS_=1;
delay_loop();
CS_=0;
delay_loop();
spi_xmit(0x08);
spi_xmit(0x81); //写发送控制寄存器
delay_loop();
CS_=1;
delay_loop();
CS_=0;
delay_loop();
spi_xmit(0x0C); //向HI3593发送FIFO写ARINC429数据
spi_xmit(0xFF);
spi_xmit(0xFF);
spi_xmit(0xFF);
spi_xmit(0xFF);
delay_loop();
CS_=1;
delay_loop();
for(;;)
{
CS_=0;
delay_loop();
while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG!=0) { }
spi_xmit(0x84); //读发送控制寄存器
//while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }
delay_loop();
rdata = SpiaRegs.SPIRXBUF;
CS_=1;
delay_loop();
}
}
// Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here:
void delay_loop()
{
for(i=5;i>0;i–)
{
for(j=4;j>0;j–)
{
for(k=23;k>0;k–)
{
//asm(" RPT #50 || NOP");
}
}
}
}
void error(void)
{
asm(" ESTOP0"); // Test failed!! Stop!
for (;;);
}
void spi_init()
{
SpiaRegs.***.all =0x000F; // Reset on, rising edge, 16-bit char bits
SpiaRegs.***.all =0x0006; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.
SpiaRegs.SPIBRR =0x007F;
SpiaRegs.***.all =0x0087; // Relinquish SPI from Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}
void spi_xmit(Uint16 a)
{
SpiaRegs.SPITXBUF=a<<8;
}
void spi_fifo_init()
{
// Initialize SPI FIFO registers
SpiaRegs.SPIFFTX.all=0xE040;
SpiaRegs.SPIFFRX.all=0x204f;
SpiaRegs.SPIFFCT.all=0x0;
}
//===================================================================
// No more.
//===================================================================
HI3593是一种总线的协议芯片,可以从总线接收数据,再通过SPI通讯把数据发给28335,同时,28335也可以给HI3593发送数据,进而HI3593将数据发给总线,还可以通过SPI通讯用28335给HI3593的寄存器进行配置。
我现在就是28335与HI3593的SPI通讯不成功,HI3593收不到数据。HI3593芯片spi工作模式是半双工,可以向HI3593发送指令操作码,紧接着发送要写入的数据,进而给HI3593寄存器进行配置,还可以发送读取寄存器的指令操作码,然后HI3593把相应寄存器的值返回给28335,芯片手册中有详细介绍。我现在的状况是,发送读取寄存器的操作码,但是没有数据返回。我的程序里有一段是向HI-3593发送FIFO写ARINC429数据,发送了这个数据之后,芯片的引脚TEMPTY会由高电平状态变为低电平状态,但是我用万用表测了一下这个引脚,电平状态并没有改变,说明数据没有发送过去,但是我没找着问题出在哪,芯片的SPI通讯在数据手册14页-16页介绍。
我用示波器抓取片选信号,显示正常,如下图
抓取时钟信号,显示正常
时钟信号
抓取主入从出信号,示波器显示有反应,但没有具体波形,输出的波为杂波。
主入从出
HI-3593测试.dochi-3593数据手册.pdf
Green Deng:抱歉确实没使用过HI3593。有参考过官方提供的SPI例程吗?C:\ti\controlSUITE\device_support\f2833x\v142\DSP2833x_examples_ccsv5\spi_loopback
图片没正确添加,使用回复框右下角的高级编辑器添加图片。
程序:
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#define CS_ GpioDataRegs.GPBDAT.bit.GPIO49 //定义IO49为片选输出信号
void delay_loop(void);
void spi_xmit(Uint16 a);
void spi_fifo_init(void);
void spi_init(void);
void error(void);
Uint16 j,i,k;
void main(void)
{
Uint16 rdata; // received data
InitSysCtrl();
InitXintf16Gpio(); //zq
InitSpiaGpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
spi_fifo_init(); // Initialize the Spi FIFO
spi_init(); // init SPI
CS_=1; //片选拉高
delay_loop();
CS_=0; //片选拉低
delay_loop();
spi_xmit(0x04); //发送软件复位操作码
delay_loop();
CS_=1;
delay_loop();
CS_=0;
delay_loop();
spi_xmit(0x10);
spi_xmit(0x01); //写接收器1控制寄存器
delay_loop();
CS_=1;
delay_loop();
CS_=0;
delay_loop();
spi_xmit(0x08);
spi_xmit(0x81); //写发送控制寄存器
delay_loop();
CS_=1;
delay_loop();
CS_=0;
delay_loop();
spi_xmit(0x0C); //向HI3593发送FIFO写ARINC429数据
spi_xmit(0xFF);
spi_xmit(0xFF);
spi_xmit(0xFF);
spi_xmit(0xFF);
delay_loop();
CS_=1;
delay_loop();
for(;;)
{
CS_=0;
delay_loop();
while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG!=0) { }
spi_xmit(0x84); //读发送控制寄存器
//while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }
delay_loop();
rdata = SpiaRegs.SPIRXBUF;
CS_=1;
delay_loop();
}
}
// Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here:
void delay_loop()
{
for(i=5;i>0;i–)
{
for(j=4;j>0;j–)
{
for(k=23;k>0;k–)
{
//asm(" RPT #50 || NOP");
}
}
}
}
void error(void)
{
asm(" ESTOP0"); // Test failed!! Stop!
for (;;);
}
void spi_init()
{
SpiaRegs.***.all =0x000F; // Reset on, rising edge, 16-bit char bits
SpiaRegs.***.all =0x0006; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.
SpiaRegs.SPIBRR =0x007F;
SpiaRegs.***.all =0x0087; // Relinquish SPI from Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}
void spi_xmit(Uint16 a)
{
SpiaRegs.SPITXBUF=a<<8;
}
void spi_fifo_init()
{
// Initialize SPI FIFO registers
SpiaRegs.SPIFFTX.all=0xE040;
SpiaRegs.SPIFFRX.all=0x204f;
SpiaRegs.SPIFFCT.all=0x0;
}
//===================================================================
// No more.
//===================================================================
HI3593是一种总线的协议芯片,可以从总线接收数据,再通过SPI通讯把数据发给28335,同时,28335也可以给HI3593发送数据,进而HI3593将数据发给总线,还可以通过SPI通讯用28335给HI3593的寄存器进行配置。
我现在就是28335与HI3593的SPI通讯不成功,HI3593收不到数据。HI3593芯片spi工作模式是半双工,可以向HI3593发送指令操作码,紧接着发送要写入的数据,进而给HI3593寄存器进行配置,还可以发送读取寄存器的指令操作码,然后HI3593把相应寄存器的值返回给28335,芯片手册中有详细介绍。我现在的状况是,发送读取寄存器的操作码,但是没有数据返回。我的程序里有一段是向HI-3593发送FIFO写ARINC429数据,发送了这个数据之后,芯片的引脚TEMPTY会由高电平状态变为低电平状态,但是我用万用表测了一下这个引脚,电平状态并没有改变,说明数据没有发送过去,但是我没找着问题出在哪,芯片的SPI通讯在数据手册14页-16页介绍。
我用示波器抓取片选信号,显示正常,如下图
抓取时钟信号,显示正常
时钟信号
抓取主入从出信号,示波器显示有反应,但没有具体波形,输出的波为杂波。
主入从出
HI-3593测试.dochi-3593数据手册.pdf
mangui zhang:将时钟片选主出存入信号同时抓出来和3593手册对时序如果自带SPI接口时序不满足
看看片选通过GPIO控制或者直接用GPIO模拟SPI进行控制