久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7536|回復: 8
打印 上一主題 下一主題
收起左側

關于STM32F103VC的SPI通信問題(AT45DB642D)

[復制鏈接]
跳轉到指定樓層
樓主
ID:58348 發表于 2014-8-21 10:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 姍姍 于 2014-8-21 10:54 編輯

寫數據總是寫不進去,有關程序如下:              /***SPI_ReadWrite_Byte()****SPI發送或接收1字節***********************/

static u8 SPI_ReadWrite_Byte(u8 byte)
        {
         /*等待發送寄存器空*/
         while((SPI2->SR & SPI_I2S_FLAG_TXE)==RESET);
            /*發送一個字節*/
         SPI2->DR = byte;
         /* 等待接收寄存器有效*/
         while((SPI2->SR & SPI_I2S_FLAG_RXNE)==RESET);
         return (SPI2->DR);
                                                 }


/***Dataflash_read_status()*****讀取狀態寄存器**************************/

u8 Dataflash_read_status(void)
        {
         u8 data;
        
         SPI_Data_Flash_AT_SELECT();                      //片選Dataflash
         SPI_ReadWrite_Byte(AT45DB_READ_STATE_REGISTER);
         data = SPI_ReadWrite_Byte(0x00);
         SPI_Data_Flash_AT_DESELECT();
         return data;
                                                                   }

/***SPI_Data_Flash_Busy_Detect()*******Data Flash  檢測忙*******************/                  

u8 SPI_Data_Flash_Busy_Detect(void)
        {
         u16 i=0;
         
         if((Dataflash_read_status() & AT45DB_DATAFLASH_BUSY_BIT) == 0)
          {
              for(i=0;i<0xff;i++);
          if((Dataflash_read_status() & AT45DB_DATAFLASH_BUSY_BIT) == 0)
            return 0; //空閑返回0
          else
            return 1;  //忙返回1
                                                            }
         else
         {
           return 1;  //忙返回1
                                                           }
                                                                }

bufferPageWrite(u8* data,u16 size,u16 buffer_add,FLASH_BUFFER_NUM buffer_num)
     {
          u16 i;
           if(SPI_Data_Flash_Busy_Detect()==0)               //==0 Data Flash空閑
                 {
                  SPI_Data_Flash_AT_SELECT();                        //片選Dataflash if (buffer_num == FLASH_BUFFER1)
                  if (buffer_num == FLASH_BUFFER1)
                  {
                   SPI_ReadWrite_Byte(AT45DB_BUFFER_1_WRITE);
                  }
                  else
                  {
                   SPI_ReadWrite_Byte(AT45DB_BUFFER_2_WRITE);
                  }
                  SPI_ReadWrite_Byte(0x00);
                  SPI_ReadWrite_Byte(0x00|(buffer_add>>8));
                  SPI_ReadWrite_Byte(buffer_add);
                                
                  for (i=0; i<size; i++)               
                  {
                   SPI_ReadWrite_Byte(data);

                                          }
                  SPI_Data_Flash_AT_DESELECT();
                                                       }
                                                                    }

void FlashPageWrite(u16 page,u8 *Data)               //寫一整頁
        {                                                                                            
         u16 i;
                 while(SPI_Data_Flash_Busy_Detect());

                 SPI_Data_Flash_AT_SELECT();                      //片選Dataflash if (buffer_num == FLASH_BUFFER1)

                 SPI_ReadWrite_Byte(AT45DB_B1_TO_MM_PAGE_PROG_WITH_ERASE);
                 while(SPI_Data_Flash_Busy_Detect());  
                 if ( page < 8192)
                 {
                  SPI_Data_Flash_AT_SELECT();                     //片選Dataflash if (buffer_num == FLASH_BUFFER1)                          
                  SPI_ReadWrite_Byte((u8)(page>>5));
                  SPI_ReadWrite_Byte((u8)(page<<3));
                  SPI_ReadWrite_Byte(0x00);


                  while(SPI_Data_Flash_Busy_Detect());

                                                      }


                 for (i = 0;i <512; i++)
                 {

                  SPI_ReadWrite_Byte(Data);

                                                 }
                 SPI_Data_Flash_AT_DESELECT();
                                                             }


在線等,謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2014-8-21 13:43 | 只看該作者
/*******************************************************
說明:
       次程序成功實現SPI簡單通信配置,能實現SPI1發送
數據,SPI2接收數據簡單通信功能,僅供測試使用。
*******************************************************/
#include "stm32f10x_lib.h"
#include "stm32f10x_conf.h"
#include "ili9320.h"
/****************************/
#define  LCD_X_ADDR  190
#define  LCD_Y_ADDR  100

vu16  SPI_IDx  = 0; //Reveive Data
u16   SPI_ID_Temp = 0; //接收數據備份,用于判斷接收到的數據是否發生變化
u16   SPI_ID[4];   //位顯示數據
/********** 函數聲明 *********/
void RCC_Configuration(void);
void NVIC_Configuration(void);
void GPIO_Configuration(void);
void SPI_Configuration(void);
void Sys_Init(void);
void LCD_Print_Out(void);
/********** 系統初始化 ******************/
void Sys_Init(void)
{
#ifdef DEBUG
    debug();
#endif
     //----- 模塊初始化配置 -------
     RCC_Configuration();
     NVIC_Configuration();
     GPIO_Configuration();
     SPI_Configuration();
      //--------- LCD -----------
     Lcd_Configuration();
     ili9320_Initializtion();
     ili9320_Clear(0);
     ili9320_PutChar(LCD_X_ADDR,     LCD_Y_ADDR, 0x30 + 0, 65535, 0);
}
/******* 主函數 **********/
int main(void)
{
     Sys_Init();
     while(1)
     {
           LCD_Print_Out();
     }
}
/******** 用于調試LCD顯示數據界面 *********/
void LCD_Print_Out(void)
{
      //如果數據發生變化,則執行數據更新
     if(SPI_ID_Temp != SPI_IDx)
     {
          if(SPI_IDx >= 1000)
          {
               SPI_ID[0] = SPI_IDx  % 10;
               SPI_ID[1] = (SPI_IDx % 100) / 10;
               SPI_ID[2] = (SPI_IDx / 100) % 10;
               SPI_ID[3] = SPI_IDx  / 1000;
               ili9320_PutChar(LCD_X_ADDR,      LCD_Y_ADDR, 0x30 + SPI_ID[0], 65535, 0);
               ili9320_PutChar(LCD_X_ADDR - 8,  LCD_Y_ADDR, 0x30 + SPI_ID[1], 65535, 0);
               ili9320_PutChar(LCD_X_ADDR - 16, LCD_Y_ADDR, 0x30 + SPI_ID[2], 65535, 0);
               ili9320_PutChar(LCD_X_ADDR - 24, LCD_Y_ADDR, 0x30 + SPI_ID[3], 65535, 0);
          }
          else if(SPI_IDx >= 100)
          {
               SPI_ID[0] = SPI_IDx  % 10;
               SPI_ID[1] = (SPI_IDx / 10) % 10;
               SPI_ID[2] = SPI_IDx  / 100;
               ili9320_PutChar(LCD_X_ADDR,      LCD_Y_ADDR, 0x30 + SPI_ID[0], 65535, 0);
               ili9320_PutChar(LCD_X_ADDR - 8,  LCD_Y_ADDR, 0x30 + SPI_ID[1], 65535, 0);
               ili9320_PutChar(LCD_X_ADDR - 16, LCD_Y_ADDR, 0x30 + SPI_ID[2], 65535, 0);
               ili9320_PutChar(LCD_X_ADDR - 24, LCD_Y_ADDR, 0x30 + SPI_ID[3], 0,     0);
         }
         else if(SPI_IDx >= 10)
         {
               SPI_ID[0] = SPI_IDx % 10;
               SPI_ID[1] = SPI_IDx / 10;
               ili9320_PutChar(LCD_X_ADDR,      LCD_Y_ADDR,  0x30 + SPI_ID[0], 65535, 0);
               ili9320_PutChar(LCD_X_ADDR - 8,  LCD_Y_ADDR,  0x30 + SPI_ID[1], 65535, 0);
               ili9320_PutChar(LCD_X_ADDR - 16, LCD_Y_ADDR, 0x30 + SPI_ID[2], 0,     0);
               ili9320_PutChar(LCD_X_ADDR - 24, LCD_Y_ADDR, 0x30 + SPI_ID[3], 0,     0);
        }
        else
        {
               SPI_ID[0] = SPI_IDx % 10;
               ili9320_PutChar(LCD_X_ADDR,   LCD_Y_ADDR, 0x30 + SPI_ID[0], 65535, 0);
               ili9320_PutChar(LCD_X_ADDR - 8,  LCD_Y_ADDR, 0x30 + SPI_ID[1], 0, 0);
               ili9320_PutChar(LCD_X_ADDR - 16, LCD_Y_ADDR, 0x30 + SPI_ID[2], 0, 0);
               ili9320_PutChar(LCD_X_ADDR - 24, LCD_Y_ADDR, 0x30 + SPI_ID[3], 0, 0);
         }
         SPI_ID_Temp = SPI_IDx;  //數據備份,為判斷數據是否發生變化
    }
}
/**************************************************************************/
/**************************************************************************/
/****** 系統時鐘配置函數 ********/
void RCC_Configuration(void)
{
      ErrorStatus  HSEStartUpStatus;

      RCC_DeInit();         //RCC system reset(for debug purpose)
      RCC_HSEConfig(RCC_HSE_ON);      //Enable HSE
      HSEStartUpStatus = RCC_WaitForHSEStartUp();  //Wait till HSE is ready
      if(HSEStartUpStatus == SUCCESS)
      {
            FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer
            FLASH_SetLatency(FLASH_Latency_2);      //Set 2 Latency cycles
            RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB clock  = SYSCLK
            RCC_PCLK2Config(RCC_HCLK_Div2);  //APB2 clock = HCLK/2
            RCC_PCLK1Config(RCC_HCLK_Div4);  //APB1 clock = HCLK/4
            RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //PLLCLK = 8MHz * 9 = 72 MHz
            RCC_PLLCmd(ENABLE);          //Enable PLL
            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);  //Wait till PLL is ready  
            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock source
            while(RCC_GetSYSCLKSource() != 0x08);  //Wait till PLL is used as system clock source
            //-----------------------------------------------------
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB
                  | RCC_APB2Periph_SPI1, ENABLE); //GPIOD clock ENABLE
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //TIM2  clock ENABLE
      }
}
/****** 中斷配置函數 ********/
void NVIC_Configuration(void)
{
      NVIC_InitTypeDef NVIC_InitStructure;

      //--- 在內存中進行調試 -----   
#ifdef VECT_TAB_RAM
      NIVC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
     //--- 在FLASH中進行調試 ----
#else
      NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
#endif

      //---- 配置TIM2中斷,并使能 -----
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
      NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      
      NVIC_Init(&NVIC_InitStructure);
    //------------------------------------
    NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
}

/********** 通用I/O配置函數 ***************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//------------------
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*****************************************************
函數名稱:SPI_Configuration(void)
功能說明:SPI通信模塊配置,配置SPI工作模式;
輸入參數:無
返回值  :無
*****************************************************/
void SPI_Configuration(void)
{
   SPI_InitTypeDef SPI_InitStructure;
   //--------------------- SPI1 configuration ------------------
   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
   SPI_InitStructure.SPI_Mode   = SPI_Mode_Master;
   SPI_InitStructure.SPI_DataSize  = SPI_DataSize_16b;
   SPI_InitStructure.SPI_CPOL   = SPI_CPOL_Low;
   SPI_InitStructure.SPI_CPHA   = SPI_CPHA_2Edge;
   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_Init(SPI1, &SPI_InitStructure);
   //--------- SPI2 configuration ------------------
   SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
   SPI_Init(SPI2, &SPI_InitStructure);
   //--------- Enable SPI1 TXE interrupt ------------
   SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_TXE, ENABLE);
   //--------- Enable SPI2 RXNE interrupt -------------
   SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE);
   //----- Enable SPI2 ------
   SPI_Cmd(SPI2, ENABLE);
   //----- Enable SPI1 ----
   SPI_Cmd(SPI1, ENABLE);
}
/*************************************************/
#ifdef DEBUG
void assert_failed(u8 *file, u32 line)
{
   while(1)
  {}
}
#endif


/***********************************************************/
/***********************************************************/

#include "stm32f10x_it.h"
/****************************/
extern vu16  SPI_IDx;
/*********** TX發送中斷服務子程序 *********************/
void SPI1_IRQHandler(void)
{
//-------- 發送數據 ----------
SPI_I2S_SendData(SPI1, 47);
}
/*********** RX接收中斷服務子程序 ****************/
void SPI2_IRQHandler(void)
{
//------------- 接收數據 ------------
SPI_IDx = SPI_I2S_ReceiveData(SPI2);
}
回復

使用道具 舉報

板凳
ID:58348 發表于 2014-8-21 13:50 | 只看該作者
admin 發表于 2014-8-21 13:43
/*******************************************************
說明:
       次程序成功實現SPI簡單通信配 ...

謝謝,好的,我試下。。
回復

使用道具 舉報

地板
ID:1 發表于 2014-8-21 16:24 | 只看該作者
m3的 AT45DB642D 驅動 打開這里下載:http://www.zg4o1577.cn/stm32/4165.html
回復

使用道具 舉報

5#
ID:58348 發表于 2014-8-22 14:14 | 只看該作者
admin 發表于 2014-8-21 16:24
m3的 AT45DB642D 驅動 打開這里下載:http://www.zg4o1577.cn/stm32/4165.html

非常感謝!
回復

使用道具 舉報

6#
ID:58348 發表于 2014-8-22 14:14 | 只看該作者
admin 發表于 2014-8-21 16:24
m3的 AT45DB642D 驅動 打開這里下載:http://www.zg4o1577.cn/stm32/4165.html

非常感謝!
回復

使用道具 舉報

7#
ID:26188 發表于 2014-8-22 14:15 來自手機 | 只看該作者
搞定了嗎  美女
回復

使用道具 舉報

8#
ID:58348 發表于 2014-9-10 10:19 | 只看該作者
hujia 發表于 2014-8-22 14:15
搞定了嗎  美女

已搞定,謝謝!!
回復

使用道具 舉報

9#
ID:210996 發表于 2017-12-12 09:53 | 只看該作者
666666,感謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩中文字幕在线免费 | 精品一区二区三区免费视频 | 四虎影音 | 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | 日韩中文在线视频 | 激情三区 | 日韩在线欧美 | 美女在线视频一区二区三区 | av特级毛片| 一区二区三区视频在线观看 | 天堂av中文在线 | 国产三区四区 | 一区二区三区不卡视频 | 国产精品美女www爽爽爽 | 国产乱码一二三区精品 | 欧美性另类 | 中文在线一区二区 | 成人午夜网站 | 亚洲视频在线看 | 国产成人一区二区三区久久久 | 欧美福利在线 | 国产极品91 | av资源在线看 | 伊人精品久久久久77777 | 国产免费a视频 | 日韩精品一区二区在线观看 | 日韩国产一区二区三区 | 久久激情视频 | 国产99久久 | 日韩一区二区福利视频 | 欧美成人a∨高清免费观看 91伊人 | 欧美日本韩国一区二区三区 | 国产精品亚洲一区二区三区在线 | 91在线电影| 久久久99精品免费观看 | 国产精品欧美一区二区三区不卡 | 一区二区三区国产精品 | 欧美h版 | 琪琪午夜伦伦电影福利片 | 国产午夜三级一区二区三 | 天天综合永久 |