CH376测试不通过

我在用CH376评诂板的SPI接口实现DSP和计算机的通信,CH376的评诂板分别和DSP和计算机相连.DSP作主机,CH376作从机,DSP的时钟频率是150M,其上的SPI接口的频率我设定为15M,当DSP上电时(没有跑程序),CH376的25脚和26脚都是3.3V,当DSP没有上电时,CH376的25脚是0.6V,26脚是3.3V,我想问的问题是:出现这种况,是不是在用SPI接口实现通信时,由于CH376作为从机,把主机(DSP)发出的时钟作为其工作时钟,而屏蔽了CH376评诂板的晶振产生的时钟.另一个问题是:当DSP没有上电时,我测出其晶振的一个脚的电压是1.58V左右,另一脚1V左右,但其频率不是12M左右,而是相差很大.

如果出现你说的DSP工作的时候,CH375的25脚电压为3.3V的话,那么说明芯片没有正常工作,你需要检查复位引脚(2脚)以及晶振是否起振,你说的电压为1.58V以及1V晶振电压,用示波器看不出来波形的话,那可能是晶振有问题,建议你换一个12M晶振。


你好,在用CH376的SPI接口实现DSP与计算机通信时,我看文档里说,CH376可工作在模式0或模式3,默认是工作在模式3,我现在想让CH376工作在模式0,我是不是在DSP里设置SPI的工作模式为模式0就可以了,其他地方不需要更改了吧,CH376开发板上的硬件也不用在调整了吧.


对于SPI时序,CH376是上升沿采样数据,下降沿输出数据,在SPI时序中,模式0和模式3是符合这种要求,所以是支持模式0和模式3,CH376本身有一些工作模式,和这个没有关系。


我在用CH376评诂板测试时,输入0x55返回的是0xAA,但是输入其的数,如0xAA,返回的怎么不是0x55啊,这是怎么回事,不是说返回值是输入的取反吗


应该是你程序问题, SCS =1; SCS = 0; 写命令 0x06 写数据 0x55 读数据 应该是0xaa SCS = 1;

SCS = 0; 写命令 0x06 写数据 0xAA 读数据 应该是0x55 SCS = 1;


你好,我现在用CH376的SPI接口,实现DSP和计算机通信功能,但测试值总是不对,我现在把我的程序发下来,麻烦你们帮忙看看,我实现是查不出原因了,谢谢

#include "DSP281x_Device.h" // DSP281x Headerfile Include File #include "DSP281x_Examples.h" // DSP281x Examples Include File #include "CH376INC.h" #include "IQmathLib.h"

#define CH376_SPI_SCS GpioDataRegs.GPFDAT.bit.GPIOF3 /* 假定CH376的SCS引脚 */ #define CH376_INT_WIRE GpioDataRegs.GPFDAT.bit.GPIOF12 /* 假定CH376的INT#引脚 */ UINT8 data_buffer[64]; UINT8 Rdata; Uint16 sdata; // send data Uint16 rdata;

/* 延时指定微秒时间,根据单片机主频调整,不精确 */ void mDelayuS( UINT16 us ) { while ( us -- ); /* DSP2812的时钟周期 */ }

/* 延时指定毫秒时间,根据单片机主频调整,不精确 */ void mDelaymS( UINT8 ms ) { while ( ms -- ) { mDelayuS( 250 ); mDelayuS( 250 ); mDelayuS( 250 ); mDelayuS( 250 ); } } UINT8 Spi376Exchange( UINT8 d ) /* 硬件SPI输出且输入8位数据 */ { /* 为了提高速度,可以将该子程序做成宏以减少子程序调用层次 */ /*DSP的数据寄存器是16位,先将8位数据左移8位,实现数据寄存器的左对齐*/ SpiaRegs.SPITXBUF=d<<8; /* 先将数据写入SPI数据寄存器,然后查询SPI状态寄存器以等待*/ /*SPI字节传输成 */ while(SpiaRegs.SPISTS.bit.INT_FLAG==0){} /* 查询SPI状态寄存器的标志位以等待SPI字节传输完成,*/ /* 数据发送完成标志位置1 */ SpiaRegs.SPIRXBUF=SpiaRegs.SPIRXBUF; /*对SPI接收缓冲空读操作,清除数据发送完成标志位 */ return((UINT8)SpiaRegs.SPIRXBUF); /*从SPI数据寄存器读出数据 */ } #define xEndCH376Cmd( ) { CH376_SPI_SCS = 1; } /* SPI片选无效,结束CH376命令,*/ /*仅用于SPI接口方式 */ void xWriteCH376Cmd( UINT8 mCmd ) /* 向CH376写命令 */ { CH376_SPI_SCS = 1; /* 防止之前未通过xEndCH376Cmd禁止SPI片选 */ /* 对于双向I/O引脚模拟SPI接口,那么必须确保已经设置SPI_SCS,SPI_SCK,SPI_SDI*/ /*为输出方向,SPI_SDO为输入方向 */ CH376_SPI_SCS = 0; /* SPI片选有效 */ Spi376Exchange( mCmd ); /* 发出命令码 */ mDelayuS( 300 ); /*延时2uS确保读写命令完成*/ } void xWriteCH376Data( UINT8 mData ) /* 向CH376写数据 */ { Spi376Exchange( mData ); mDelayuS( 150 ); /* 数据写周期延时1uS */

} UINT8 xReadCH376Data( void ) /* 从CH376读数据 */ { mDelayuS( 150 ); /* 数据读周期延时1uS */ return( Spi376Exchange( 0xFF )); } UINT8 Query376Interrupt( void ) { return( CH376_INT_WIRE ? FALSE : TRUE ); /* 如果连接了CH376的中断引脚则直接查询中断引脚 */ } void CH376_INT_TRANS( ) { UINT8 status,i,len; xWriteCH376Cmd(CMD01_GET_STATUS); status = xReadCH376Data( ); //获取中断状态 xEndCH376Cmd(); switch( status ) { case USB_INT_EP2_OUT: //端点2下传成功中断 xWriteCH376Cmd(CMD01_RD_USB_DATA); len = xReadCH376Data( ); //读取下传的数据长度 for(i=0;i!=len;i++) data_buffer[i] = xReadCH376Data( );//依次读取下传数据 xEndCH376Cmd(); xWriteCH376Cmd(CMD10_WR_USB_DATA7);//将下传的数据依次按位取反,返回给计算机 xWriteCH376Data( len ); for(i=0;i!=len;i++) xWriteCH376Data( ~data_buffer[i] ); xEndCH376Cmd(); break; case USB_INT_EP1_OUT: //端点1下传成功,流程同端点2相同 xWriteCH376Cmd(CMD01_RD_USB_DATA); len = xReadCH376Data( ); for(i=0;i!=len;i++) data_buffer[i] = xReadCH376Data( ); xEndCH376Cmd(); xWriteCH376Cmd(CMD10_WR_USB_DATA5); xWriteCH376Data( len ); for(i=0;i!=len;i++) xWriteCH376Data( data_buffer[i] ); xEndCH376Cmd(); break; case USB_INT_EP1_IN: //端点1上传成功 xWriteCH376Cmd(CMD00_UNLOCK_USB); //释放缓冲区 xEndCH376Cmd(); break; case USB_INT_EP2_IN: //端点1上传成功 xWriteCH376Cmd(CMD00_UNLOCK_USB); //释放缓冲区 xEndCH376Cmd(); break; default: break;

}

} void spi_init() { // Initialize SPI-A: SpiaRegs.SPICCR.bit.SPISWRESET=0; // Reset SPI //SPI配置控制寄存器设置 SpiaRegs.SPICCR.all=0x0007; //位7.Reset=0,SPI复位 //bit6,时钟极性,常和时钟相位结合,bit6=0, 在SPICLK的时钟上升沿输出数据 //bit5保留, //bit4=0,环路返回模式禁止 //bit3-bit0=8,8位数据传输 //SPI控制寄存器设置 SpiaRegs.SPICTL.all=0x0006; //Interrupt enabled, Master/Slave XMIT enabled //bit7-bit5保留 //bit4=0,禁止接收溢出中断 //bit3=0,SPI时钟相位选择为无相位延时 //bit2=1,主/从模式选择为主模式 //bit1=1,主/从发送数据使能位,使能发送,Talk //bit0=0,SPI中断使能位,禁止中断 //SPI状态寄存器,初始值全为0 SpiaRegs.SPISTS.all=0x0000; //SPI波特率寄存器设置,即波特率为1.5MHz SpiaRegs.SPIBRR=0x0009; // Baud rate //SPI优先级控制寄存器,自由运行模式 SpiaRegs.SPIPRI.all=0x0001; //SPI配置控制寄存器退出复位 SpiaRegs.SPICCR.bit.SPISWRESET=1; // Enable SPI }

void main(void) { // Uint16 sdata; // send data // Uint16 rdata; // received data int16 i; // Step 1. Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the DSP281x_SysCtrl.c file. InitSysCtrl();

// Step 2. Initalize GPIO: // This example function is found in the DSP281x_Gpio.c file and // illustrates how to set the GPIO to it's default state. // InitGpio(); // Skipped for this example // Setup only the GP I/O only for SPI functionality EALLOW; GpioMuxRegs.GPFMUX.all=0x0007; // 设置IO口为SPI外设功能 // Port F MUX - x000 0000 0000 0111 GpioMuxRegs.GPFMUX.bit.SPISTEA_GPIOF3=0; //设置GPIOF3口为通用数字I/O口 GpioMuxRegs.GPFDIR.bit.GPIOF3=1; //设置通用数字I/O口GPIOF3为输出 GpioDataRegs.GPFDAT.bit.GPIOF3=1; //设置通用数字I/O口GPIOF3的初始值为高,即片选无效 GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9=0; //设置GPIOF12口为通用数字I/O口 GpioMuxRegs.GPBDIR.bit.GPIOB9=0; //设置通用数字I/O口GPIOF12为输入 GpioMuxRegs.GPBQUAL.all=0x0; //设置通用数字I/O口GPIOF12为输入限制 SysCtrlRegs.LOSPCP.all = 0x0005; //设置低速外设时钟频率,即外设时钟频率15MHz EDIS;

// Step 3. Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts DINT;

// Initialize PIE control registers to their default state. // The default state is all PIE interrupts disabled and flags // are cleared. // This function is found in the DSP281x_PieCtrl.c file. InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000; // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). // This will populate the entire table, even if the interrupt // is not used in this example. This is useful for debug purposes. // The shell ISR routines are found in DSP281x_DefaultIsr.c. // This function is found in DSP281x_PieVect.c. InitPieVectTable(); // Step 4. Initialize all the Device Peripherals: // This function is found in DSP281x_InitPeripherals.c // InitPeripherals(); // Not required for this example // spi_fifo_init(); // Initialize the Spi FIFO spi_init(); // 初始化DSP的SPI接口功能 // Step 5. User specific code: // Interrupts are not used in this example. sdata = 0x0000; // mDelaymS(7500 ); // 延时50ms while(1) { xWriteCH376Cmd(0x06); //做测试命令,检测硬件连接,以及接口程序是否正确。 xWriteCH376Data(0x55); rdata= xReadCH376Data( ); //正常应该返回0xaa //i== xReadCH376Data( ) xEndCH376Cmd(); /* if ( xReadCH376Data( ) != 0xAA ) { // CH376不正常 for ( i=80; i!=0; i-- ) { xWriteCH376Cmd( CMD00_RESET_ALL ); // 多次重复发命令,执行硬件复位 xReadCH376Data( ); } xWriteCH376Cmd( 0 ); mDelaymS(7500 ); // 延时50ms } */ } /* //设备初始化 xWriteCH376Cmd(CMD11_SET_USB_MODE);//设置USB的内置固件,设备模式 xWriteCH376Data( 2 ); //for(i=50;i!=0;i--) for(;;


怎么没人回答呀,我用示波器查看DSP输出的值是正的,但从CH376返回的值一直是高电平,也就是0xFF不知道是什么原因?


将你的单片机主板 和CH376评估板之间 多连地线 测试一下


我在用CH376的SPI口和计算计通信时,现在测试的结果有时能出现原数据的取反,但不稳定,会发生变化,不知道是什么原因


我用CH376的SPI口实现DSP和计算机通信,现在测试结果一直不对,当输入0x55或0xAA时,返回的数据有时是正确的,但有时不正确,当输入别的数据时,如0x11,返回结果就一直不对,我查了CH376芯片的25脚和26脚,25脚为低电平,26脚也为低电平,我通过软件和硬件复位两种法都试过了,也无法让26脚为高电平,不知道这是什么原因?


对于CH376 复位完成之后25脚为低电平 没有通过26脚来判断,和CH375不一样 测试命令不通过 一般就硬件连接有问题,软件上查看读写时序,以及命令和数据之间有2-4us的延时,数据和数据之间有1us左右的延时,上电之后先延时50ms左右在操作CH376 如果是手工飞线, 就是先把SPI时钟降下来,减少外部干扰,甚至将单片机端和CH376之间多连几根地线


只有登录才能回复,可以选择微信账号登录