哪位大神帮我看看SPI通信,正点原子SPI程序改的,但输出一直不对

2019-07-21 01:22发布

    我是想用SPI控制数字电位器,电位器型号TPL0501,配置的是SPI1,但电位器电压输出一直不对,是乱的和给的芯片手册上不一致,有哪位大神帮忙指导一下吧
[mw_shl_code=c,true]spi.c

void SPI1_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;

        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA, ENABLE );//PORTBʱÖÓʹÄÜ
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_SPI1,  ENABLE );//SPI2ʱÖÓʹÄÜ        

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PA4/5/7¸´ÓÃÍÆÍìÊä³ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOA

//        GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7);  //PB13/14/15ÉÏÀ

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //ÉèÖÃSPIµ¥Ïò»òÕßË«ÏòµÄÊý¾Ýģʽ:SPIÉèÖÃΪ˫ÏßË«ÏòÈ«Ë«¹¤
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //ÉèÖÃSPI¹¤×÷ģʽ:ÉèÖÃΪÖ÷SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //ÉèÖÃSPIµÄÊý¾Ý´óС:SPI·¢ËͽÓÊÕ8λ֡½á¹¹
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //´®ÐÐͬ²½Ê±ÖӵĿÕÏÐ״̬Ϊ¸ßµçƽ
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //´®ÐÐͬ²½Ê±Öӵĵڶþ¸öÌø±äÑØ£¨ÉÏÉý»òϽµ£©Êý¾Ý±»²ÉÑù
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSSÐźÅÓÉÓ²¼þ£¨NSS¹Ü½Å£©»¹ÊÇÈí¼þ£¨Ê¹ÓÃSSI룩¹ÜÀí:ÄÚ²¿NSSÐźÅÓÐSSIλ¿ØÖÆ
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //¶¨Ò岨ÌØÂÊÔ¤·ÖƵµÄÖµ:²¨ÌØÂÊÔ¤·ÖƵֵΪ256
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //Ö¸¶¨Êý¾Ý´«Êä´ÓMSBλ»¹ÊÇLSBλ¿ªÊ¼:Êý¾Ý´«Êä´ÓMSBλ¿ªÊ¼
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRCÖµ¼ÆËãµÄ¶àÏîʽ
        SPI_Init(SPI1, &SPI_InitStructure);  //¸ù¾ÝSPI_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèSPIx¼Ä´æÆ÷

        SPI_Cmd(SPI1, ENABLE); //ʹÄÜSPIÍâÉè
}


void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)
{
  assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
        SPI1->CR1&=0XFFC7;
        SPI1->CR1|=SPI_BaudRatePrescaler;        //ÉèÖÃSPI2ËÙ¶È
        SPI_Cmd(SPI1,ENABLE);

}

u8 SPI1_WriteByte(u8 byte)
{
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}                // ÅжÏSPI1 ·¢ËÍ»º³åÇøÊÇ·ñ¿Õ  
  SPI_I2S_SendData(SPI1, byte);                                                                                                        // ·¢ËÍ8λÊý¾Ý
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){}          // ÅжÏÊÇ·ñ½ÓÊÕ»º³åÇø·Ç¿Õ
  return SPI_I2S_ReceiveData(SPI1);
}


void TPL0501_Write_SR(u8 sr)   
{   
        TPL0501=0;                            //ʹÄÜÆ÷¼þ   
        SPI1_WriteByte(sr);                       //дÈëÒ»¸ö×Ö½Ú  
        TPL0501=1;                            //È¡ÏûƬѡ                  
}   

spi.h


#ifndef __SYS_H
#define __SYS_H       
#include "stm32f10x.h"
//////////////////////////////////////////////////////////////////////////////////         
//±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾ ×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
//ALIENTEK STM32¿ª·¢°å                  
//ÕýµãÔ ×Ó@ALIENTEK
//¼¼ÊõÂÛ̳:www.openedv.com
//ÐÞ¸ÄÈÕÆÚ:2012/8/18
//°æ±¾£ºV1.7
//°æȨËùÓУ¬µÁ°æ±Ø¾¿¡£
//Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////          

//0,²»Ö§³Öucos
//1,Ö§³Öucos
#define SYSTEM_SUPPORT_OS                0                //¶¨ÒåϵͳÎļþ¼ÐÊÇ·ñÖ§³ÖUCOS
                                                                                                                                            
         
//λ´ø²Ù×÷,ʵÏÖ51ÀàËƵÄGPIO¿ØÖƹ¦ÄÜ
//&frac34;&szlig;&Igrave;&aring;&Ecirc;&micro;&Iuml;&Ouml;&Euml;&frac14;&Iuml;&euml;,&sup2;&Icirc;&iquest;&frac14;<<CM3&Egrave;¨&Iacute;&thorn;&Ouml;&cedil;&Auml;&Iuml;>>&micro;&Uacute;&Icirc;&aring;&Otilde;&Acirc;(87&Ograve;&sup3;~92&Ograve;&sup3;).
//IO&iquest;&Uacute;&sup2;&Ugrave;×÷&ordm;ê&para;¨&Ograve;&aring;
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
//IO&iquest;&Uacute;&micro;&Oslash;&Ouml;·&Oacute;&sup3;&Eacute;&auml;
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C   
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C   

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08

//IO&iquest;&Uacute;&sup2;&Ugrave;×÷,&Ouml;&raquo;&para;&Ocirc;&micro;&yen;&Ograve;&raquo;&micro;&Auml;IO&iquest;&Uacute;!
//&Egrave;·±&pound;n&micro;&Auml;&Ouml;&micro;&ETH;&iexcl;&Oacute;&Uacute;16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //&Ecirc;&auml;&sup3;&ouml;
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //&Ecirc;&auml;&Egrave;&euml;

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //&Ecirc;&auml;&sup3;&ouml;
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //&Ecirc;&auml;&Egrave;&euml;

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //&Ecirc;&auml;&sup3;&ouml;
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //&Ecirc;&auml;&Egrave;&euml;

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //&Ecirc;&auml;&sup3;&ouml;
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //&Ecirc;&auml;&Egrave;&euml;

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //&Ecirc;&auml;&sup3;&ouml;
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //&Ecirc;&auml;&Egrave;&euml;

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //&Ecirc;&auml;&sup3;&ouml;
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //&Ecirc;&auml;&Egrave;&euml;

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //&Ecirc;&auml;&sup3;&ouml;
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //&Ecirc;&auml;&Egrave;&euml;

//&Ograve;&Ocirc;&Iuml;&Acirc;&Icirc;&ordf;&raquo;&atilde;±à&ordm;&macr;&Ecirc;&yacute;
void WFI_SET(void);                //&Ouml;&acute;&ETH;&ETH;WFI&Ouml;&cedil;&Aacute;&icirc;
void INTX_DISABLE(void);//&sup1;&Oslash;±&Otilde;&Euml;ù&Oacute;&ETH;&Ouml;&ETH;&para;&Iuml;
void INTX_ENABLE(void);        //&iquest;&ordf;&AElig;&ocirc;&Euml;ù&Oacute;&ETH;&Ouml;&ETH;&para;&Iuml;
void MSR_MSP(u32 addr);        //&Eacute;è&Ouml;&Atilde;&para;&Ntilde;&Otilde;&raquo;&micro;&Oslash;&Ouml;·

#endif


main.c
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"         
#include "spi.h"
/************************************************
ALIENTEK&frac34;&laquo;&Oacute;&cent;STM32&iquest;&ordf;·&cent;°&aring;&Ecirc;&micro;&Ntilde;é23
SPI &Ecirc;&micro;&Ntilde;é  
&frac14;&frac14;&Ecirc;&otilde;&Ouml;§&sup3;&Ouml;&pound;&ordm;www.openedv.com
&Igrave;&Ocirc;±&brvbar;&micro;ê&AElig;&Igrave;&pound;&ordm;http://eboard.taobao.com
&sup1;&Oslash;×&cent;&Icirc;&cent;&ETH;&Aring;&sup1;&laquo;&Ouml;&Uacute;&AElig;&frac12;&Igrave;¨&Icirc;&cent;&ETH;&Aring;&ordm;&Aring;&pound;&ordm;"&Otilde;&yacute;&micro;&atilde;&Ocirc; ×&Oacute;"&pound;&not;&Atilde;&acirc;·&Ntilde;&raquo;&ntilde;&Egrave;&iexcl;STM32×&Ecirc;&Aacute;&Iuml;&iexcl;&pound;
&sup1;&atilde;&Ouml;&Yacute;&Ecirc;&ETH;&ETH;&Ccedil;&Ograve;í&micro;&ccedil;×&Oacute;&iquest;&AElig;&frac14;&frac14;&Oacute;&ETH;&Iuml;&THORN;&sup1;&laquo;&Euml;&frac34;  
×÷&Otilde;&szlig;&pound;&ordm;&Otilde;&yacute;&micro;&atilde;&Ocirc; ×&Oacute; @ALIENTEK
************************************************/

                                        
//&Ograve;&ordf;&ETH;&acute;&Egrave;&euml;&micro;&frac12;W25Q64&micro;&Auml;×&Ouml;·&ucirc;&acute;&reg;&Ecirc;&yacute;×é
//const u8 TEXT_Buffer[]={"ELITE STM32 SPI TEST"};
//#define SIZE sizeof(TEXT_Buffer)
int main(void)
{       
        delay_init();                     //&Ntilde;&Oacute;&Ecirc;±&ordm;&macr;&Ecirc;&yacute;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;          
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//&Eacute;è&Ouml;&Atilde;&Ouml;&ETH;&para;&Iuml;&Oacute;&Aring;&Iuml;&Egrave;&frac14;&para;·&Ouml;×é&Icirc;&ordf;×é2&pound;&ordm;2&Icirc;&raquo;&Ccedil;&Agrave;&Otilde;&frac14;&Oacute;&Aring;&Iuml;&Egrave;&frac14;&para;&pound;&not;2&Icirc;&raquo;&Iuml;ì&Oacute;&brvbar;&Oacute;&Aring;&Iuml;&Egrave;&frac14;&para;
        uart_init(115200);                 //&acute;&reg;&iquest;&Uacute;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;&Icirc;&ordf;115200
        KEY_Init();                                //°&acute;&frac14;ü&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;                                 
        SPI1_Init();                        //W25QXX&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;
        SPI1_SetSpeed(SPI_BaudRatePrescaler_2);
         
         
        while(1)
        {
TPL0501_Write_SR(128);
        }

}







[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
繁星点点starry
1楼-- · 2019-07-21 02:50
大神帮忙看看啊
xiedonghui258
2楼-- · 2019-07-21 06:39
STM32 的SPI 是4线的,你这个只有3线。。所以,直接用模拟的方法吧,,
繁星点点starry
3楼-- · 2019-07-21 07:56
我不用STM32 接受只发送应该也行吧,配置完直接调用不应该就可以吗?

一周热门 更多>