OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9213|回复: 11

SPI 发射数据

[复制链接]

16

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-7-11
在线时间
0 小时
发表于 2012-8-3 10:38:44 | 显示全部楼层 |阅读模式
 /*头文件--------------------------------------------------------------------------*/
#include "stm32f10x_lib.h"
//#include "stm32f10x.h"
//#include "stm32f10x_systick.h"
#include "stdio.h"
#include "string.h"

SPI_InitTypeDef SPI_InitStructure;//定义SPI初始化结构体
vu8 LED_out[9];//SPI待发射数码管码字
vu8 LED_buf[30]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,
                0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0xFF,0xFF,0xFF,0x00,0x00,0x00};   
const u8 LED_bm[32]=
{
    /*显示字符:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,0.,1.,2.,3.,4.,5.,6.,7.,8.,9.,灭,-,-,-,-,-*/
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
    0x40,0x79,0x24,0x30,0x19,0x12,0x20,0x78,0x00,0x10,0xff,0xbf,0xbf,0xbf,0xbf,0xbf
};

/*自定义函数声明--------------------------------------------------------------------*/
void RCC_Configuration(void);//设置系统时钟                   
void GPIO_Configuration(void);//设置GPIO端口
void SPI_Configuration(void);//设置SPI
void SysTick_Configuration(void);//设置定时器
void Delay_Second(void);//延时函数
void RTC_Configurate(void);
void NVIC_Configuration(void);


int main(void)
{
    u8    i,j,temp=0x80,temp1,temp2,temp3;
    const u8 *p;
    p=&LED_bm[0];
    RCC_Configuration();
    GPIO_Configuration();
    SPI_Configuration();
    SysTick_Configuration();
    RTC_Configurate();
    NVIC_Configuration();
    SPI_I2S_DeInit(SPI1);//将外设SPI1寄存器重设为默认值

/*设这SPI为发射机--------------------------------------------------------------------*/
    SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
    SPI_Init(SPI1,&SPI_InitStructure);
    SPI_Cmd(SPI1,ENABLE);//使能SPI
    while(1)
    {
//        GPIO_SetBits(GPIOB,GPIO_Pin_0);
        for(i=0;i<8;i++)
        {
            if((LED_buf[27]==0)&&(LED_buf[29]==0)){temp1=LED_buf;}
            else if(LED_buf[27]==i+1){temp1=0x1a;}
            LED_out[0]=*(p+temp1);

            if((LED_buf[27]==0)&&(LED_buf[29]==0)){temp2=LED_buf[i+8];}
            else if(LED_buf[27]==i+9){temp2=0x1a;}
            LED_out[3]=*(p+temp2);

            if((LED_buf[27]==0)&&(LED_buf[29]==0)){temp3=LED_buf[i+16];}
            else if(LED_buf[27]==i+17){temp3=0x1a;}
            LED_out[6]=*(p+temp3);

            LED_out[2]=LED_buf[24];
            LED_out[5]=LED_buf[25];
            LED_out[8]=LED_buf[26];
            if((LED_buf[28]==0)&&(LED_buf[29]==0))
            {   
                LED_out[2]=LED_buf[24];
                LED_out[5]=LED_buf[25];
                LED_out[8]=LED_buf[26];
            }
            else if(LED_buf[28]!=0)
            {
                switch(LED_buf[28])
                {
                    case 0x01ED_buf[24]&=0x01;break;case 0x02ED_buf[24]&=0x02;break;
                    case 0x03ED_buf[24]&=0x04;break;case 0x04ED_buf[24]&=0x08;break;
                    case 0x05ED_buf[24]&=0x10;break;case 0x06ED_buf[24]&=0x20;break;
                    case 0x07ED_buf[24]&=0x40;break;case 0x08ED_buf[24]&=0x80;break;
                    case 0x09ED_buf[25]&=0x01;break;case 0x0aED_buf[25]&=0x02;break;
                    case 0x0b:LED_buf[25]&=0x04;break;case 0x0c:LED_buf[25]&=0x08;break;
                    case 0x0d:LED_buf[25]&=0x10;break;case 0x0e:LED_buf[25]&=0x20;break;
                    case 0x0f:LED_buf[25]&=0x40;break;case 0x10:LED_buf[25]&=0x80;break;
                    case 0x11:LED_buf[26]&=0x01;break;case 0x12:LED_buf[26]&=0x02;break;
                    case 0x13:LED_buf[26]&=0x04;break;case 0x14:LED_buf[26]&=0x08;break;
                    case 0x15:LED_buf[26]&=0x10;break;case 0x16:LED_buf[26]&=0x20;break;
                    case 0x17:LED_buf[26]&=0x40;break;case 0x18:LED_buf[26]&=0x80;break;
                    default:break;
                }
                LED_out[2]=LED_buf[24];
                LED_out[5]=LED_buf[25];
                LED_out[8]=LED_buf[26];
            }
            LED_out[1]=temp;
            LED_out[4]=temp;
            LED_out[7]=temp;
            for(j=0;j<9;j++)
            {
                while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
                SPI_I2S_SendData(SPI1,LED_out[j]);
                while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)== RESET);
                SPI_I2S_ReceiveData(SPI1);
            }
            GPIO_SetBits(GPIOB,GPIO_Pin_1);//输出九个字节后CS输出一个高电平的脉冲
            GPIO_ResetBits(GPIOB,GPIO_Pin_1);           
            temp>>=1;//控制码字左移移位
            if(temp==0x00) {temp=0x80;}
            Delay_Second();//延时3ms
        }   
    }
}

void RCC_Configuration(void)
{
    ErrorStatus HSEStartUpStatus;            //定义枚举类型变量HSEStartUpStatus
    RCC_DeInit();                             //复位系统时钟
    RCC_HSEConfig(RCC_HSE_ON);                 //开启HSE
    HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待HSE起振并稳定
/*判断HSE起是否振成功,是则进入if(内部)*/
    if(HSEStartUpStatus==SUCCESS)             
    {
        RCC_HCLKConfig(RCC_SYSCLK_Div1);     //选择HCLK(APB)时钟源为SYSCLK 1分频
        RCC_PCLK2Config(RCC_SYSCLK_Div1);     //选择PCLK2时钟源为HCLK(APB) 1分频
        RCC_PCLK1Config(RCC_SYSCLK_Div2);     //选择PCLK1时钟源为HCLK(APB) 2分频
        FLASH_SetLatency(FLASH_Latency_0);     //设置Flash延时周期数为0
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能Flash预取缓存
/*选择PLL时钟源为HSE 1分频*/
//        RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
//        RCC_PLLCmd(ENABLE);                     //使能PLL
        while(RCC_GetFlagStatus(RCC_FLAG_HSERDY==RESET));//等待HSE输出稳定
        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);//选择SYSCLK时钟为HSE
        while(RCC_GetSYSCLKSource()!=0x04);     //    等待PLL成为SYS时钟源
    }

/*打开GPIOA、GPIOB和SPI1时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_SPI1,ENABLE);
}

void GPIO_Configuration(void)
{
/*定义GPIO初始化结构体*/
    GPIO_InitTypeDef GPIO_InitStructure;
/*设置SPI引脚:SCK,MISO和MOSI*/
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
/*设置SPI引脚:CS*/
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
}


void SPI_Configuration(void)
{
/*SPI设置为双线双向全双工,SPI发送接收8位帧结构,时钟悬空低,数据
捕获雨第1个时钟沿,内部HSE信号由SSI位控制,波特率预分频值为4,数据
传输从MSB为开始,用于CRC值计算的多项式*/
    SPI_InitStructure.SPI_Direction=SPI_Direction_1Line_Tx;
    SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
    SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;
    SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial=7;
/*设置SPI为发射机*/
    SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
    SPI_Init(SPI1,&SPI_InitStructure);
    SPI_Cmd(SPI1,ENABLE);//使能SPI
   
   
}

void SysTick_Configuration(void)
{
    SysTick_CounterCmd(SysTick_Counter_Disable);         //失能Systick定时器
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择HCLK为Systick时钟源
    SysTick_CounterCmd(SysTick_Counter_Clear);             //消除Systick计数器
/*主频为11.0592MHz,设置计数器值为33177.6可以得到3ms定时间隔*/
    SysTick_SetReload(27000);
}

void Delay_Second(void)
{                                                       
    SysTick_CounterCmd(SysTick_Counter_Enable);             //启动Systick计数
    while(SysTick_GetFlagStatus(SysTick_FLAG_COUNT)==0); //等待Systick计数至0
    SysTick_CounterCmd(SysTick_Counter_Disable);         //失能Systick定时器
    SysTick_CounterCmd(SysTick_Counter_Clear);             //清楚Systick计数器
}
 void RTC_Configurate(void)
{
      /* Enable PWR and BKP clocks */ //使能PWR和备份模块
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);     
   
      /* Allow access to BKP Domain */
      PWR_BackupAccessCmd(ENABLE);            //使能备份访问
   
      /* Reset Backup Domain */
      BKP_DeInit();                            //初始化为缺省值
   
      /* Enable HSE */
      RCC_HSEConfig(RCC_HSE_ON);            //使能外部高速时钟
      /* Wait till LSE is ready */
      while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET)      //等待时钟就绪
      {}
   
      /* Select LSE as RTC Clock Source */
      RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);     //选择外部高速时钟128分频作为时钟源
   
      /* Enable RTC Clock */
      RCC_RTCCLKCmd(ENABLE);                            //使能RTC时钟
   
      /* Wait for RTC registers synchronization */
      RTC_WaitForSynchro();                                //等待时钟寄存器同步
   
      /* Wait until last write operation on RTC registers has finished */
      RTC_WaitForLastTask();                            //等待最后一次写操作完成
   
      /* Enable the RTC Second */ 
      RTC_ITConfig(RTC_IT_SEC, ENABLE);                    //使能秒中断
   
      /* Wait until last write operation on RTC registers has finished */
      RTC_WaitForLastTask();                            //等待最后一次写操作完成
   
      /* Set RTC prescaler: set RTC period to 500MS */
      RTC_SetPrescaler(43199); /* RTC period = RTCCLK/RTC_PR = (11059.2/128 KHz)/(43199+1) */
   
      /* Wait until last write operation on RTC registers has finished */
      RTC_WaitForLastTask();                           //等待写操作完成
   
}
//-----------------------NVIC向量表配置函数---------------------------
/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    :
                  
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;    //构造一个NVIC结构体对象
    NVIC_InitStructure.NVIC_IRQChannel =RTC_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}


大神  偶的程序有问题吗 是不能发射数据吗
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

292

帖子

1

精华

高级会员

Rank: 4

积分
614
金钱
614
注册时间
2012-7-6
在线时间
0 小时
发表于 2012-8-3 10:46:52 | 显示全部楼层
得哪去测试下,看时看不出问题的!
STM32F3系列公司现有货供应!STM32F0,STM32F2,STM32F3,STM32F4 银洋电子专业一级代理http://www.y-ec.com 联系电话:021-53086303  淘宝网:http://y-ec.taobao.com
回复 支持 反对

使用道具 举报

16

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-7-11
在线时间
0 小时
 楼主| 发表于 2012-8-3 11:01:23 | 显示全部楼层
回复【2楼】shyinyang:
---------------------------------
我已经测试了  数据发射不出去 
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-3 11:18:08 | 显示全部楼层
发一通代码,就说不行.还不如直接叫别人帮你写得了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-3 11:20:03 | 显示全部楼层
提问的智慧:
http://www.openedv.com/posts/list/7213.htm
http://www.openedv.com/posts/list/4670.htm
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-7-11
在线时间
0 小时
 楼主| 发表于 2012-8-3 13:22:25 | 显示全部楼层
回复【4楼】正点原子:
我调试了 两天都没有调试出来
回复 支持 反对

使用道具 举报

16

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-7-11
在线时间
0 小时
 楼主| 发表于 2012-8-3 13:25:01 | 显示全部楼层
回复【4楼】正点原子 
不回答就算了 还这样说 
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-3 13:55:16 | 显示全部楼层
看着你这代码+精简的描述,我表示很蛋疼.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-7-11
在线时间
0 小时
 楼主| 发表于 2012-8-3 14:30:14 | 显示全部楼层
回复【8楼】正点原子:
好吧  是我没有说明白  我想知道
                        u8  LED_out[9]={0x90,0x80,0x70,0x60,0x50,0x40,0x30,0x20,x010};
                        int main (void)
                        {
for(j=0;j<9;j++)
{
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI1,LED_out[j]);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)== RESET);
SPI_I2S_ReceiveData(SPI1);
}
                        }这样能将九个字节的数发射出去吧???????

回复 支持 反对

使用道具 举报

9

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
287
金钱
287
注册时间
2012-3-19
在线时间
37 小时
发表于 2012-8-3 14:33:09 | 显示全部楼层
呵呵
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-3 16:41:21 | 显示全部楼层
回复【9楼】juli.w:
---------------------------------
代码无问题.
看SPI初始化是否有问题吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-7-11
在线时间
0 小时
 楼主| 发表于 2012-8-6 09:25:28 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
嗯 谢谢你 
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-22 01:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表