Files
QDAC-firmware/libraries/zf_driver/zf_driver_spi.c

545 lines
27 KiB
C
Raw Permalink Normal View History

2023-12-11 21:45:06 +08:00
/*********************************************************************************************************************
* CH32V307VCT6 Opensourec Library <EFBFBD><EFBFBD><EFBFBD><EFBFBD>CH32V307VCT6 <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڹٷ<EFBFBD> SDK <EFBFBD>ӿڵĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>
* Copyright (c) 2022 SEEKFREE <EFBFBD><EFBFBD><EFBFBD>ɿƼ<EFBFBD>
*
* <EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>CH32V307VCT6 <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* CH32V307VCT6 <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GPL<EFBFBD><EFBFBD>GNU General Public License<EFBFBD><EFBFBD><EFBFBD><EFBFBD> GNUͨ<EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> GPL <EFBFBD>ĵ<EFBFBD>3<EFBFBD><EFBFBD><EFBFBD> GPL3.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>κκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><EFBFBD><EFBFBD>
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κεı<EFBFBD>֤
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><EFBFBD>ʺ<EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD>;<EFBFBD>ı<EFBFBD>֤
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD> GPL
*
* <EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<EFBFBD>յ<EFBFBD>һ<EFBFBD><EFBFBD> GPL <EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><https://www.gnu.org/licenses/>
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD> GPL3.0 <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤Э<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>İ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӣ<EFBFBD>İ<EFBFBD><EFBFBD><EFBFBD> libraries/doc <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> GPL3_permission_statement.txt <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> libraries <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> LICENSE <EFBFBD>ļ<EFBFBD>
* <EFBFBD><EFBFBD>ӭ<EFBFBD><EFBFBD>λʹ<EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<EFBFBD><EFBFBD>İ<EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> zf_driver_spi
* <EFBFBD><EFBFBD>˾<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ɶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>޹<EFBFBD>˾
* <EFBFBD><EFBFBD><EFBFBD>Ϣ <EFBFBD> libraries/doc <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> version <EFBFBD>ļ<EFBFBD> <EFBFBD>˵<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MounRiver Studio V1.8.1
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ̨ CH32V307VCT6
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> https://seekfree.taobao.com/
*
* <EFBFBD>޸ļ<EFBFBD>¼
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ע
* 2022-09-15 <EFBFBD><EFBFBD>W first version
********************************************************************************************************************/
#include "zf_driver_gpio.h"
#include "zf_driver_spi.h"
const uint32 spi_index[3] = {SPI1_BASE, SPI2_BASE, SPI3_BASE};
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿ<EFBFBD>д 8bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_write_8bit(SPI_1,0x11);
//-------------------------------------------------------------------------------------------------------------------
void spi_write_8bit (spi_index_enum spi_n, const uint8 dat)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = dat; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET); // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿ<EFBFBD>д 8bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data <20><><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_write_8bit_array(SPI_1,data,64);
//-------------------------------------------------------------------------------------------------------------------
void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *dat, uint32 len)
{
while(len--)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = *(dat++);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿ<EFBFBD>д 16bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_write_16bit(SPI_1,0x1101);
//-------------------------------------------------------------------------------------------------------------------
void spi_write_16bit (spi_index_enum spi_n, const uint16 dat)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)((dat & 0xFF00)>>8);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)(dat & 0x00FF);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿ<EFBFBD>д 16bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data <20><><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_write_16bit_array(SPI_1,data,64);
//-------------------------------------------------------------------------------------------------------------------
void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *dat, uint32 len)
{
while(len--)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)((*dat & 0xFF00)>>8);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)(*dat++ & 0x00FF);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿ<EFBFBD><D3BF>򴫸<EFBFBD><F2B4ABB8><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>д 8bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_write_8bit_register(SPI_1,0x11,0x01);
//-------------------------------------------------------------------------------------------------------------------
void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, const uint8 dat)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = register_name;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY));
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = dat;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY));
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿ<EFBFBD><D3BF>򴫸<EFBFBD><F2B4ABB8><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>д 8bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data <20><><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_write_8bit_registers(SPI_1,0x11,data,32);
//-------------------------------------------------------------------------------------------------------------------
void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, const uint8 *dat, uint32 len)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = register_name;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
while(len--)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = *dat++;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿ<EFBFBD><D3BF>򴫸<EFBFBD><F2B4ABB8><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>д 16bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_write_16bit_register(SPI_1,0x1011,0x0101);
//-------------------------------------------------------------------------------------------------------------------
void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, const uint16 dat)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)((register_name & 0xFF00)>>8);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)(register_name & 0x00FF);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)((dat & 0xFF00)>>8);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)(dat & 0x00FF);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿ<EFBFBD><D3BF>򴫸<EFBFBD><F2B4ABB8><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>д 16bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data <20><><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_write_16bit_registers(SPI_1,0x1011,data,32);
//-------------------------------------------------------------------------------------------------------------------
void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name, const uint16 *dat, uint32 len)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)((register_name & 0xFF00)>>8);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)(register_name & 0x00FF);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
while(len--)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)((*dat & 0xFF00)>>8);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)(*dat++ & 0x00FF);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿڶ<D3BF> 8bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 <20><><EFBFBD><EFBFBD>
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_read_8bit(SPI_1);
//-------------------------------------------------------------------------------------------------------------------
uint8 spi_read_8bit (spi_index_enum spi_n)
{
uint8 dat = 0;
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = 0;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
//while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_RXNE) == RESET);
dat = ((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
return dat;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿڶ<D3BF> 8bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data <20><><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_read_8bit_array(SPI_1,data,64);
//-------------------------------------------------------------------------------------------------------------------
void spi_read_8bit_array (spi_index_enum spi_n, uint8 *dat, uint32 len)
{
while(len--)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = 0;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
//while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_RXNE) == RESET);
*dat++ = ((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿڶ<D3BF> 16bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint16 <20><><EFBFBD><EFBFBD>
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_read_16bit(SPI_1);
//-------------------------------------------------------------------------------------------------------------------
uint16 spi_read_16bit (spi_index_enum spi_n)
{
uint16 dat = 0;
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = 0;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
dat = ((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = 0;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
dat = ((dat << 8)| ((SPI_TypeDef *)(spi_index[spi_n]))->DATAR);
return dat;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿڶ<D3BF> 16bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data <20><><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_read_16bit_array(SPI_1,data,64);
//-------------------------------------------------------------------------------------------------------------------
void spi_read_16bit_array (spi_index_enum spi_n, uint16 *dat, uint32 len)
{
while(len--)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = 0;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
//while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_RXNE) == RESET);
*dat = ((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = 0;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
//while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_RXNE) == RESET);
*dat = ((*dat << 8)| ((SPI_TypeDef *)(spi_index[spi_n]))->DATAR);
dat++;
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿڴӴ<DAB4><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD> 8bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 <20><><EFBFBD><EFBFBD>
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_read_8bit_register(SPI_1,0x11);
//-------------------------------------------------------------------------------------------------------------------
uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name)
{
uint8 dat;
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = register_name;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY));
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = 2;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY));
dat = ((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
return dat;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿڴӴ<DAB4><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD> 8bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data <20><><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_read_8bit_registers(SPI_1,0x11,data,32);
//-------------------------------------------------------------------------------------------------------------------
void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, uint8 *dat, uint32 len)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = register_name;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY));
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
while(len--)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = 0;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY));
*dat++ = ((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿڴӴ<DAB4><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD> 16bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint16 <20><><EFBFBD><EFBFBD>
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_read_16bit_register(SPI_1,0x1011);
//-------------------------------------------------------------------------------------------------------------------
uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name)
{
uint16 dat = 0;
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)((register_name & 0xFF00)>>8);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)(register_name & 0x00FF);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = 0;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
//while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_RXNE) == RESET);
dat = ((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = 0;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
//while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_RXNE) == RESET);
dat = ((dat << 8)| ((SPI_TypeDef *)(spi_index[spi_n]))->DATAR);
return dat;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿڴӴ<DAB4><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD> 16bit <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data <20><><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_read_16bit_registers(SPI_1,0x1101,data,32);
//-------------------------------------------------------------------------------------------------------------------
void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, uint16 *dat, uint32 len)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)((register_name & 0xFF00)>>8);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (uint8)(register_name & 0x00FF);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
while(len--)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = 0;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
//while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_RXNE) == RESET);
*dat = ((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = 0;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
//while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_RXNE) == RESET);
*dat = ((*dat << 8)| ((SPI_TypeDef *)(spi_index[spi_n]))->DATAR);
dat++;
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI 8bit <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD>е<EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> write_buffer <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> read_buffer <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĴ洢<C4B4><E6B4A2>ַ(<28><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL)
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_transfer_8bit(SPI_1,buf,buf,1);
//-------------------------------------------------------------------------------------------------------------------
void spi_transfer_8bit (spi_index_enum spi_n,const uint8 *write_buffer, uint8 *read_buffer, uint32 len)
{
while(len--)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = *(write_buffer++);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
if(read_buffer != NULL)
{
//while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_RXNE) == RESET);
*read_buffer++ = ((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI 16bit <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD>е<EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> write_buffer <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> read_buffer <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĴ洢<C4B4><E6B4A2>ַ(<28><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL)
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_transfer_16bit(SPI_1,buf,buf,1);
//-------------------------------------------------------------------------------------------------------------------
void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint16 *read_buffer, uint32 len)
{
while(len--)
{
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (*write_buffer&0xFF00)>>8;
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
if(read_buffer != NULL)
{
//while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_RXNE) == RESET);
*read_buffer++ = ((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
}
((SPI_TypeDef *)(spi_index[spi_n]))->DATAR = (*write_buffer&0x00FF);
while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_BSY) != RESET);
if(read_buffer != NULL)
{
//while((((SPI_TypeDef *)(spi_index[spi_n]))->STATR & SPI_I2S_FLAG_RXNE) == RESET);
*read_buffer = ((SPI_TypeDef *)(spi_index[spi_n]))->DATAR;
}
write_buffer++;
read_buffer++;
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI <20>ӿڳ<D3BF>ʼ<EFBFBD><CABC>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> spi_n SPI ģ<><C4A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_index_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> mode SPI ģʽ <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_mode_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> baud <20><><EFBFBD><EFBFBD> SPI <20>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳʱ<CDB3>ӵ<EFBFBD>һ<EFBFBD><D2BB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʻ<CABB><E1B1BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> sck_pin ѡ<><D1A1> SCK <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_pin_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> mosi_pin ѡ<><D1A1> MOSI <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_pin_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> miso_pin ѡ<><D1A1> MISO <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_spi.h <20><> spi_pin_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> cs_pin ѡ<><D1A1> CS <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_gpio.h <20><> gpio_pin_enum ö<><C3B6><EFBFBD><EFBFBD><E5B6A8>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> spi_init(SPI_1, 0, 1*1000*1000, SPI1_SCK_A5, SPI1_MOSI_A7, SPI1_MISO_A6, A4); //Ӳ<><D3B2>SPI<50><49>ʼ<EFBFBD><CABC> ģʽ0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1Mhz
//-------------------------------------------------------------------------------------------------------------------
void spi_init(spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_pin_enum sck_pin, spi_pin_enum mosi_pin, spi_pin_enum miso_pin, gpio_pin_enum cs_pin)
{
SPI_I2S_DeInit((SPI_TypeDef *)(spi_index[spi_n]));
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
if(sck_pin == SPI1_MAP1_SCK_B3 && mosi_pin == SPI1_MAP1_MOSI_B5)
{
GPIO_PinRemapConfig(GPIO_Remap_SPI1, ENABLE);
}
else if(sck_pin == SPI3_MAP1_SCK_C10 && mosi_pin == SPI3_MAP1_MOSI_C12)
{
GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);
}
if(SPI_1 == spi_n) RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // SPI1ʱ<31><CAB1>ʹ<EFBFBD><CAB9>
else if(SPI_2 == spi_n) RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); // SPI2ʱ<32><CAB1>ʹ<EFBFBD><CAB9>
else if(SPI_3 == spi_n) RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); // SPI3ʱ<33><CAB1>ʹ<EFBFBD><CAB9>
gpio_init(sck_pin & 0xFF, GPO, 1, SPEED_50MHZ|GPO_AF_PUSH_PULL);
gpio_init(mosi_pin & 0xFF, GPO, 1, SPEED_50MHZ|GPO_AF_PUSH_PULL);
if(miso_pin != SPI_MISO_NULL)
{
gpio_init(miso_pin & 0xFF, GPI, 1, SPEED_50MHZ|GPI_PULL_UP);
}
if(cs_pin != PIN_NULL)
{
gpio_init(cs_pin & 0xFF, GPO, 0, SPEED_50MHZ|GPO_PUSH_PULL);
}
SPI_InitTypeDef SPI_InitStructure = {0};
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // SPI<50><49><EFBFBD><EFBFBD>Ϊ˫<CEAA><CBAB>˫<EFBFBD><CBAB>ȫ˫<C8AB><CBAB>
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; // <20><><EFBFBD><EFBFBD>SPI<50><49><EFBFBD><EFBFBD>ģʽ:<3A><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // <20><><EFBFBD><EFBFBD>SPI<50><49><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С:SPI<50><49><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>8λ֡<CEBB>
switch(mode)
{
case SPI_MODE0:
{
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // <20><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>ʱ<EFBFBD>ӵĿ<D3B5><C4BF><EFBFBD>״̬Ϊ<CCAC>͵<EFBFBD>ƽ
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; // <20><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>ʱ<EFBFBD>ӵĵ<D3B5>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD>
}break;
case SPI_MODE1:
{
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // <20><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>ʱ<EFBFBD>ӵĿ<D3B5><C4BF><EFBFBD>״̬Ϊ<CCAC>͵<EFBFBD>ƽ
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; // <20><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>ʱ<EFBFBD>ӵĵڶ<C4B5><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD>
}break;
case SPI_MODE2:
{
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; // <20><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>ʱ<EFBFBD>ӵĿ<D3B5><C4BF><EFBFBD>״̬Ϊ<CCAC>ߵ<EFBFBD>ƽ
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; // <20><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>ʱ<EFBFBD>ӵĵ<D3B5>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD>
}break;
case SPI_MODE3:
{
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; // <20><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>ʱ<EFBFBD>ӵĿ<D3B5><C4BF><EFBFBD>״̬Ϊ<CCAC>ߵ<EFBFBD>ƽ
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; // <20><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>ʱ<EFBFBD>ӵĵڶ<C4B5><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD>
}break;
}
uint16 psc = 0;
psc = system_clock / baud; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶֵ
if((system_clock % baud)== 0)
{
psc = psc - 1;
}
if(psc >= 128) psc = SPI_BaudRatePrescaler_256; // CLK_0.5625M
else if(psc >= 64) psc = SPI_BaudRatePrescaler_128; // CLK_1.125M
else if(psc >= 32) psc = SPI_BaudRatePrescaler_64; // CLK_2.25M
else if(psc >= 16) psc = SPI_BaudRatePrescaler_32; // CLK_4.5M
else if(psc >= 8) psc = SPI_BaudRatePrescaler_16; // CLK_9M
else if(psc >= 4) psc = SPI_BaudRatePrescaler_8; // CLK_18M
else if(psc >= 2) psc = SPI_BaudRatePrescaler_4; // CLK_36M
else if(psc >= 1) psc = SPI_BaudRatePrescaler_2; // CLK_72M
else zf_assert(0);
SPI_InitStructure.SPI_BaudRatePrescaler = psc; // <20><><EFBFBD><EFBFBD><E5B2A8><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4>Ƶ<EFBFBD><C6B5>ֵ
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // <20><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NSS<53><53><EFBFBD><EFBFBD>
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>MSBλ<42><CEBB><EFBFBD><EFBFBD>LSBλ<42><CEBB>ʼ:<3A><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>MSBλ<42><CEBB>ʼ
SPI_InitStructure.SPI_CRCPolynomial = 7; // CRCֵ<43><D6B5><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>ʽ
SPI_Init((SPI_TypeDef *)(spi_index[spi_n]), &SPI_InitStructure); // <20><><EFBFBD><EFBFBD>SPI_InitStruct<63><74>ָ<EFBFBD><D6B8><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPIx<49>Ĵ<EFBFBD><C4B4><EFBFBD>
SPI_Cmd(((SPI_TypeDef *)(spi_index[spi_n])), ENABLE); // ʹ<><CAB9>SPI<50><49><EFBFBD><EFBFBD>
}