问答

汇集网友智慧,解决技术难题

21ic问答首页 - TAG - spi通信
  • HC32F460 SPI通信问题

    大家好,在使用HC32F460 的SPI时,碰到这个问题: 1 / HC32F460 可以正常发送数据, 外部的设备也正常回复数据,但是HC32F460 确收不到数据(读取DR寄存器得到的是刚才发送的数据) 2/ 已经使用示波器观测波形,确认发送是正常的(外部设备也只有在收到数据后才回复) 。示波器上的波形也显示外部设备返回了一个数据。 以下是代码 [b][color=#0000f0]//SPI的配置[/color][/b] void Spi_Config(void) { stc_spi_init_t stcSpiInit; /* configuration structure initialization */ MEM_ZERO_STRUCT(stcSpiInit); /* Configuration peripheral clock */ PWC_Fcg1PeriphClockCmd(SPI_UNIT_CLOCK, Enable); /* Configuration SPI pin */ PORT_SetFunc(SPI_SCK_PORT, SPI_SCK_PIN, SPI_SCK_FUNC, Disable); PORT_SetFunc(SPI_MOSI_PORT, SPI_MOSI_PIN, SPI_MOSI_FUNC, Disable); PORT_SetFunc(SPI_MISO_PORT, SPI_MISO_PIN, SPI_MISO_FUNC, Disable); // PORT_SetFunc(SPI_CS_PORT, SPI_CS_PIN, SPI_NSS_FUNC, Disable); [color=#f00000]//CS 单独控制[/color] /* Configuration SPI structure */ stcSpiInit.enClkDiv = SpiClkDiv8; //SpiClkDiv32 SpiClkDiv64 stcSpiInit.enFrameNumber = SpiFrameNumber1; stcSpiInit.enDataLength = SpiDataLengthBit8;//SpiDataLengthBit32 SpiDataLengthBit16 SpiDataLengthBit8 stcSpiInit.enFirstBitPosition = SpiFirstBitPositionMSB; stcSpiInit.enSckPolarity = SpiSckIdleLevelLow; stcSpiInit.enSckPhase = SpiSckOddChangeEvenSample; // SpiSckOddSampleEvenChange old--SpiSckOddChangeEvenSample stcSpiInit.enReadBufferObject = SpiReadReceiverBuffer; //SpiReadSendBuffer old--SpiReadReceiverBuffer stcSpiInit.enWorkMode = SpiWorkMode3Line; stcSpiInit.enTransMode = SpiTransFullDuplex; stcSpiInit.enCommAutoSuspendEn = Disable; //Disable stcSpiInit.enModeFaultErrorDetectEn = Disable; stcSpiInit.enParitySelfDetectEn = Disable; stcSpiInit.enParityEn = Disable; stcSpiInit.enParity = SpiParityEven; stcSpiInit.enMasterSlaveMode = SpiModeMaster; stcSpiInit.stcDelayConfig.enSsSetupDelayOption = SpiSsSetupDelayTypicalSck1; stcSpiInit.stcDelayConfig.enSsSetupDelayTime = SpiSsSetupDelaySck1; stcSpiInit.stcDelayConfig.enSsHoldDelayOption = SpiSsHoldDelayCustomValue; stcSpiInit.stcDelayConfig.enSsHoldDelayTime = SpiSsHoldDelaySck1; stcSpiInit.stcDelayConfig.enSsIntervalTimeOption = SpiSsIntervalCustomValue; stcSpiInit.stcDelayConfig.enSsIntervalTime = SpiSsIntervalSck6PlusPck2; SPI_Init(SPI_UNIT, &stcSpiInit); SPI_Cmd(SPI_UNIT, Enable); } [color=#0000f0][b]//SPI读取函数[/b][/color] UINT8 SPI_Read( void ) /* 从CH376读数据 */ { UINT16 spi_u8Tmp=0; SPI_CS_OnOff(1); SPI_CS_OnOff(0); [color=#f00000]//使能CS端口[/color] Ddl_Delay1us(100); SPI_SendData8(SPI_UNIT, 0x55); /* Wait rx buffer full */ while (Reset == SPI_GetFlag(SPI_UNIT, SpiFlagReceiveBufferFull)) { } spi_u8Tmp=SPI_ReceiveData16(SPI_UNIT); [color=#f00000]//此处得到的数据,是0x55,也就是跟发送的一样,外部设备返回的是0xAA(示波器上也是显示0xAA)[/color] Ddl_Delay1us(10); Ddl_Delay1us(1000); SPI_CS_OnOff(1); printf("spi_u8Tmp==%hx",spi_u8Tmp); return (UINT8)spi_u8Tmp; } 谢谢

    hc32f460 spi 华大MCU spi通信 ST

    2244浏览量 5回复量 关注量
  • DSPIC30F 双机SPI通信 sos

    大佬们,我用microchip的DSPIC30F2020和DSPIC30F6011A进行SPI通信,要实现的功能是6011A发送给2020,然后2020再回传给6011A,但是实际测试时一直不好使,附上部分代码2020端: /**************spi初始化***************/ clr SPI1BUF ;SPI模块500/738(SPIxBUF缓冲器)(SPIxSR移入移除数据) bclr IFS0, #SPI1IF ;将IFS0中的指定位清0,SPI1中断标志状态位,中断标志状态位0=未发生中断请求 bset IEC0, #SPI1IE ;置一,中断允许控制寄存器,1=允许中断请求,使能SPI中断 mov #0x0c5b, w0 mov w0, SPI1CON1 ;(495)时钟极性:空闲状态时钟信号为高电平.有效状态为低电平,从动模式,辅预分频比2:1,主预分频比1:1 bclr SPI1STAT, #SPISIDL ;空闲模式下继续工作 bclr SPI1STAT, #SPIROV ;接收溢出标志位0=没有发生溢出 bset SPI1STAT, #SPIEN ;SPI使能位1=使能模块,并将SCKx、SDOx、SDIx 和SSx 配置为串口引脚 /*SPI中断设置优先级 标识位置0 中断时能置1 */ bclr.b IFS0+1, #0 ;.b 字节模式选择,清零,0=未发生中断请求 SPI1中断标志状态位 bset.b IEC0+1, #0 ;置1使能,中断允许控制寄存器,外部中断0允许位,=允许中断请求 bset.b IPC2, #0 ;中断优先级控制寄存器2,SPI1中断优先级位110=6级 修改为7级 bset.b IPC2, #1 ; bset.b IPC2, #2 ; 2020SPI中断: __SPI1Interrupt: disi #20 ;禁止中断,持续时间为10个指令周 push.s ;压入影子寄存 bclr IFS0, #SPI1IF ;将IFS0中的指定位清零,为下次SPI中断准备,SPI1中断标志状态位,0=未发生中断请求 bclr SPI1STAT, #SPIROV ; mov SPI1BUF, w3 ;将SPI接收的电流数电压信号据存入W3 mov w3,Sign ; mov Sign,w1; lsr w1,#8,w2; mov w2,PORTB; mov w3,PORTE; NOP NOP NOP NOP mov #0x047A, w0 mov w0, SPI1CON1 ;(495)时钟极性:空闲状态时钟信号为高电平.有效状态为低电平,从动模式,辅预分频比2:1,主预分频比1:1 bclr SPI1STAT, #SPISIDL ;空闲模式下继续工作 bclr SPI1STAT, #SPIROV ;接收溢出标志位0=没有发生溢出 bset SPI1STAT, #SPIEN ;SPI使能位1=使能模块,并将SCKx、SDOx、SDIx 和SSx 配置为串口引脚 mov #800,w0 mov w0,SPI1BUF 6011A端: void initspi2() //连2020 { SPI2BUF=0; IFS1bits.SPI2IF=0; IEC1bits.SPI2IE=1; IPC6bits.SPI2IP=3; SPI2CON = 0x047B; //空闲高电平,有效低电平,上升沿输出数据,主控模式, //辅助分频比2:1,主预分频比4:1 0000 0100 0111 1010 SPI2STATbits.SPIROV = 0; //接收未发生溢出 SPI2STATbits.SPISIDL = 0; //空闲模式下继续工作 SPI2STATbits.SPIEN = 1; //使能SPI } void __attribute__((interrupt,no_auto_psv)) _SPI2Interrupt(void) { if( SPI2STATbits.SPITBF==0) { SPI2BUF=0; //发送中断,转成接受模式 IFS1bits.SPI2IF=0; IEC1bits.SPI2IE=1; IPC6bits.SPI2IP=3; SPI2CON=0X24DA; //SPI2STATbits.SPIROV=0; //No Receive Overflow Has Occurred SPI2STATbits.SPIEN = 1; //Enable SPI Module } if( SPI2STATbits.SPIRBF==1)//********************************************* { IFS1bits.SPI2IF=0; //接收中断,读取数值,转成发送模式 SPI2STATbits.SPIROV = 0; int i; temp=SPI2BUF; for(;i<10;i++); //周期50μs PR3 = 1000; OC5R =0 ; OC5RS=200; PR3 = 1000; OC6R=20; OC6RS=200; SPI2CON = 0x047B; //空闲高电平,有效低电平,上升沿输出数据,主控模式, //辅助分频比2:1,主预分频比4:1 0000 0100 0111 1010 SPI2STATbits.SPIROV = 0; //接收未发生溢出 SPI2STATbits.SPISIDL = 0; //空闲模式下继续工作 SPI2STATbits.SPIEN = 1; //使能SPI } }

    spi通信 双机 dsPIC30F ov ST

    2678浏览量 0回复量 关注量
  • msp430f149 SPI通信问题

    初始化后,是不是时钟引脚会马上就有时钟输出

    msp430f149 spi通信 时钟 引脚

    606浏览量 13回复量 关注量