添加PAN159资料
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file lib_driver_adc_pan159.c
|
||||
* @brief
|
||||
*
|
||||
* ADC对应的IO口:
|
||||
* ---------+-----------
|
||||
* ADC_CH0 | P5.3(5)
|
||||
* ---------+-----------
|
||||
* ADC_CH1 | P1.0(7)
|
||||
* ---------+-----------
|
||||
* ADC_CH2 | P1.2(8)
|
||||
* ---------+-----------
|
||||
* ADC_CH3 | P1.3(9)
|
||||
* ---------+-----------
|
||||
* ADC_CH4 | P1.4(10)
|
||||
* ---------+-----------
|
||||
* ADC_CH5 | P1.5(11)
|
||||
* ---------+-----------
|
||||
* ADC_CH6 | P3.0(13)
|
||||
* ---------+-----------
|
||||
* ADC_CH7 | P3.1(17)
|
||||
* ---------+-----------
|
||||
*
|
||||
* @history - V1.0, 2017-09-18, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
#include "lib_driver_adc_pan159.h"
|
||||
|
||||
const static uint8_t adc_chns_table[] = {
|
||||
#if ADC_ENABLE_CH0_P53 != 0
|
||||
ADC_PAN159_CH0_P53,
|
||||
#endif
|
||||
#if ADC_ENABLE_CH1_P10 != 0
|
||||
ADC_PAN159_CH1_P10,
|
||||
#endif
|
||||
#if ADC_ENABLE_CH2_P12 != 0
|
||||
ADC_PAN159_CH2_P12,
|
||||
#endif
|
||||
#if ADC_ENABLE_CH3_P13 != 0
|
||||
ADC_PAN159_CH3_P13,
|
||||
#endif
|
||||
#if ADC_ENABLE_CH4_P14 != 0
|
||||
ADC_PAN159_CH4_P14,
|
||||
#endif
|
||||
#if ADC_ENABLE_CH5_P15 != 0
|
||||
ADC_PAN159_CH5_P15,
|
||||
#endif
|
||||
#if ADC_ENABLE_CH6_P30 != 0
|
||||
ADC_PAN159_CH6_P30,
|
||||
#endif
|
||||
#if ADC_ENABLE_CH7_P31 != 0
|
||||
ADC_PAN159_CH7_P31,
|
||||
#endif
|
||||
0x00
|
||||
};
|
||||
#define ADC_CHN_NUM_COUNT (sizeof(adc_chns_table)-1)
|
||||
static int8_t adc_cur_chn_index = 0;
|
||||
|
||||
void adc_pan159_init(void)
|
||||
{
|
||||
ADC_POWER_ON(ADC);
|
||||
if(ADC_ENABLE_CH0_P53){
|
||||
SYS->P5_MFP &= ~SYS_MFP_P53_Msk;
|
||||
SYS->P5_MFP |= SYS_MFP_P53_ADC_CH0;
|
||||
GPIO_DISABLE_DIGITAL_PATH(P5,BIT3);
|
||||
}
|
||||
if(ADC_ENABLE_CH1_P10){
|
||||
SYS->P1_MFP &= ~SYS_MFP_P10_Msk;
|
||||
SYS->P1_MFP |= SYS_MFP_P10_ADC_CH1;
|
||||
GPIO_DISABLE_DIGITAL_PATH(P1,BIT0);
|
||||
}
|
||||
if(ADC_ENABLE_CH2_P12){
|
||||
SYS->P1_MFP &= ~SYS_MFP_P12_Msk;
|
||||
SYS->P1_MFP |= SYS_MFP_P12_ADC_CH2;
|
||||
GPIO_DISABLE_DIGITAL_PATH(P1,BIT2);
|
||||
}
|
||||
if(ADC_ENABLE_CH3_P13){
|
||||
SYS->P1_MFP &= ~SYS_MFP_P13_Msk;
|
||||
SYS->P1_MFP |= SYS_MFP_P13_ADC_CH3;
|
||||
GPIO_DISABLE_DIGITAL_PATH(P1,BIT3);
|
||||
}
|
||||
if(ADC_ENABLE_CH4_P14){
|
||||
SYS->P1_MFP &= ~SYS_MFP_P14_Msk;
|
||||
SYS->P1_MFP |= SYS_MFP_P14_ADC_CH4;
|
||||
GPIO_DISABLE_DIGITAL_PATH(P1,BIT4);
|
||||
}
|
||||
if(ADC_ENABLE_CH5_P15){
|
||||
SYS->P1_MFP &= ~SYS_MFP_P15_Msk;
|
||||
SYS->P1_MFP |= SYS_MFP_P15_ADC_CH5;
|
||||
GPIO_DISABLE_DIGITAL_PATH(P1,BIT5);
|
||||
}
|
||||
if(ADC_ENABLE_CH6_P30){
|
||||
SYS->P3_MFP &= ~SYS_MFP_P30_Msk;
|
||||
SYS->P3_MFP |= SYS_MFP_P30_ADC_CH6;
|
||||
GPIO_DISABLE_DIGITAL_PATH(P3,BIT0);
|
||||
}
|
||||
if(ADC_ENABLE_CH7_P31){
|
||||
SYS->P3_MFP &= ~SYS_MFP_P31_Msk;
|
||||
SYS->P3_MFP |= SYS_MFP_P31_ADC_CH7;
|
||||
GPIO_DISABLE_DIGITAL_PATH(P3,BIT1);
|
||||
}
|
||||
}
|
||||
|
||||
void adc_pan159_samp2(uint16_t *buf)
|
||||
{
|
||||
/* 获取当前通道 */
|
||||
//uint8_t curr_index = adc_cur_chn_index;
|
||||
//int16_t curr_chn = adc_chns_table[curr_index];
|
||||
|
||||
//adc_pan159_start(adc_chns_table[adc_cur_chn_index],6);
|
||||
ADC->CHEN = adc_chns_table[adc_cur_chn_index];
|
||||
ADC->EXTSMPT = (ADC->EXTSMPT & ~ADC_EXTSMPT_EXTSMPT_Msk) | 6;
|
||||
ADC_START_CONV(ADC);
|
||||
while(adc_pan159_is_busy());
|
||||
/* 读取ADC转换结果 */
|
||||
buf[adc_cur_chn_index] = adc_pan159_value();
|
||||
|
||||
/* 计算下一个通道 */
|
||||
if(adc_cur_chn_index < ADC_CHN_NUM_COUNT-1){
|
||||
adc_cur_chn_index++;
|
||||
}
|
||||
else{
|
||||
adc_cur_chn_index = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void adc_pan159_samp1(uint16_t *buf)
|
||||
{
|
||||
ADC->CHEN = ADC_PAN159_CH3_P13;
|
||||
//ADC->CHEN = ADC_PAN159_CH1_P10 ;
|
||||
ADC->EXTSMPT = (ADC->EXTSMPT & ~ADC_EXTSMPT_EXTSMPT_Msk) | 6;
|
||||
ADC_START_CONV(ADC);
|
||||
while(adc_pan159_is_busy());
|
||||
/* 读取ADC转换结果 */
|
||||
buf[0] = adc_pan159_value();
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file lib_driver_adc_pan159.h
|
||||
* @brief
|
||||
*
|
||||
* ADC¶ÔÓ¦µÄIO¿Ú:
|
||||
* ---------+-----------
|
||||
* ADC_CH0 | P5.3(5)
|
||||
* ---------+-----------
|
||||
* ADC_CH1 | P1.0(7)
|
||||
* ---------+-----------
|
||||
* ADC_CH2 | P1.2(8)
|
||||
* ---------+-----------
|
||||
* ADC_CH3 | P1.3(9)
|
||||
* ---------+-----------
|
||||
* ADC_CH4 | P1.4(10)
|
||||
* ---------+-----------
|
||||
* ADC_CH5 | P1.5(11)
|
||||
* ---------+-----------
|
||||
* ADC_CH6 | P3.0(13)
|
||||
* ---------+-----------
|
||||
* ADC_CH7 | P3.1(17)
|
||||
* ---------+-----------
|
||||
*
|
||||
* @history - V1.0, 2017-09-18, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
#ifndef __LIB_DIRVER_ADC_PAN159_H
|
||||
#define __LIB_DIRVER_ADC_PAN159_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
|
||||
#include "Mini58Series.h"
|
||||
|
||||
#define ADC_ENABLE_CH0_P53 0
|
||||
#define ADC_ENABLE_CH1_P10 0
|
||||
#define ADC_ENABLE_CH2_P12 0
|
||||
#define ADC_ENABLE_CH3_P13 1
|
||||
#define ADC_ENABLE_CH4_P14 0
|
||||
#define ADC_ENABLE_CH5_P15 0
|
||||
#define ADC_ENABLE_CH6_P30 0
|
||||
#define ADC_ENABLE_CH7_P31 0
|
||||
|
||||
#define ADC_PAN159_CH0_P53 (1<<0)
|
||||
#define ADC_PAN159_CH1_P10 (1<<1)
|
||||
#define ADC_PAN159_CH2_P12 (1<<2)
|
||||
#define ADC_PAN159_CH3_P13 (1<<3)
|
||||
#define ADC_PAN159_CH4_P14 (1<<4)
|
||||
#define ADC_PAN159_CH5_P15 (1<<5)
|
||||
#define ADC_PAN159_CH6_P30 (1<<6)
|
||||
#define ADC_PAN159_CH7_P31 (1<<7)
|
||||
|
||||
void adc_pan159_init(void);
|
||||
void adc_pan159_start(uint8_t chn, uint8_t smplclks);
|
||||
void adc_pan159_samp2(uint16_t *buf);
|
||||
void adc_pan159_samp1(uint16_t *buf);
|
||||
#define adc_pan159_value() ADC_GET_CONVERSION_DATA(ADC,NULL)
|
||||
#define adc_pan159_is_busy() ADC_IS_BUSY(ADC)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif //__LIB_DIRVER_ADC_PAN159_H
|
||||
@@ -0,0 +1,18 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file lib_driver_delay_pan159.c
|
||||
* @brief PAN159 delay
|
||||
*
|
||||
* @history - V1.0, 2017-09-12, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
#include "lib_driver_delay_pan159.h"
|
||||
|
||||
__ASM void __delay_pan159(uint32_t cycle)
|
||||
{
|
||||
__delay_pan159_loop
|
||||
SUBS r0,r0,#1
|
||||
BCS __delay_pan159_loop
|
||||
BX lr
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file lib_driver_delay_pan159_v1p0.h
|
||||
* @brief PAN159 delay
|
||||
* 注意:该延时函数在系统时钟为48MHz时准确
|
||||
*
|
||||
* @history - V1.0, 2017-09-12, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
#ifndef __DRIVER_DELAY_PAN159_H
|
||||
#define __DRIVER_DELAY_PAN159_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
|
||||
#include "Mini58Series.h"
|
||||
|
||||
void __delay_pan159(uint32_t cycle);
|
||||
#define delay_pan159_us(us) do{if((us)){__delay_pan159((us)*12);}}while(0)
|
||||
#define delay_pan159_ms(ms) do{uint32_t cnt=(ms);while(cnt--){delay_pan159_us(2070);}}while(0)
|
||||
|
||||
#define delay_us delay_pan159_us
|
||||
#define delay_ms delay_pan159_ms
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __DRIVER_DELAY_PAN159_H
|
||||
@@ -0,0 +1,136 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file drv_flash.c
|
||||
* @brief FLASH读写
|
||||
*
|
||||
* @history - V1.0, 2017-03-10, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
#include "lib_driver_flash_pan159.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief FLASH擦除扇区(512字节)
|
||||
* @param[in] addr - 起始地址(512字节对齐)
|
||||
* sectors - 要擦除的连续扇区数目
|
||||
* @param[out] 无
|
||||
* @return 无
|
||||
* @history - V1.0, 2017-03-13, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
void flash_pan159_erase(uint32_t addr, uint16_t sectors)
|
||||
{
|
||||
SYS_UnlockReg();
|
||||
FMC_Open();
|
||||
FMC_ENABLE_SP_UPDATE();
|
||||
while(sectors != 0)
|
||||
{
|
||||
FMC_Erase(addr);
|
||||
addr += 128;
|
||||
sectors--;
|
||||
}
|
||||
FMC_DISABLE_SP_UPDATE();
|
||||
FMC_Close();
|
||||
SYS_LockReg();
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief FLASH数据写入
|
||||
* @param[in] addr - 写入起始地址,要求4字节对齐
|
||||
* p_addr - 数据指针
|
||||
* len - 数据长度(字节为单位)
|
||||
* @param[out] 无
|
||||
* @return 无
|
||||
* @history - V1.0, 2017-03-13, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
void flash_pan159_write(uint32_t addr, void* p_data, uint16_t len)
|
||||
{
|
||||
#define PTR32 ((uint32_t*)p_data)
|
||||
#define PTR8 ((uint8_t*)p_data)
|
||||
uint16_t i;
|
||||
union{
|
||||
uint32_t u32;
|
||||
struct{
|
||||
uint8_t x0;
|
||||
uint8_t x1;
|
||||
uint8_t x2;
|
||||
uint8_t x3;
|
||||
}u8;
|
||||
}tmp;
|
||||
tmp.u32 = 0xFFFFFFFF;
|
||||
|
||||
SYS_UnlockReg();
|
||||
FMC_Open();
|
||||
FMC_ENABLE_SP_UPDATE();
|
||||
for(i = 0; i < (len>>2); i++)
|
||||
{
|
||||
FMC_Write(addr,PTR32[i]);
|
||||
addr += 4;
|
||||
}
|
||||
i <<= 2;
|
||||
if(i < len)
|
||||
{
|
||||
tmp.u8.x0 = PTR8[i++];
|
||||
if(i < len)
|
||||
{
|
||||
tmp.u8.x1 = PTR8[i++];
|
||||
if(i < len)
|
||||
{
|
||||
tmp.u8.x2 = PTR8[i];
|
||||
}
|
||||
}
|
||||
FMC_Write(addr,tmp.u32);
|
||||
}
|
||||
FMC_DISABLE_SP_UPDATE();
|
||||
FMC_Close();
|
||||
SYS_LockReg();
|
||||
|
||||
#undef PTR8
|
||||
#undef PTR32
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief FLASH数据读取
|
||||
* @param[in] addr - 读取起始地址,要求4字节对齐
|
||||
* len - 数据长度(字节为单位)
|
||||
* @param[out] p_data - 数据缓冲区指针,帯回数据
|
||||
* @return 无
|
||||
* @history - V1.0, 2017-03-13, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
void flash_pan159_read(uint32_t addr, void* p_data, uint16_t len)
|
||||
{
|
||||
#define PTR32 ((uint32_t*)p_data)
|
||||
#define PTR8 ((uint8_t*)p_data)
|
||||
#define TMP (*((uint32_t*)tmp))
|
||||
uint16_t i;
|
||||
uint8_t tmp[4];
|
||||
|
||||
SYS_UnlockReg();
|
||||
FMC_Open();
|
||||
FMC_ENABLE_SP_UPDATE();
|
||||
for(i = 0; i < (len>>2); i++)
|
||||
{
|
||||
PTR32[i] = FMC_Read(addr);
|
||||
addr += 4;
|
||||
}
|
||||
i <<= 2;
|
||||
if(i < len)
|
||||
{
|
||||
TMP = FMC_Read(addr);
|
||||
PTR8[i++] = tmp[0];
|
||||
if(i < len)
|
||||
{
|
||||
PTR8[i++] = tmp[1];
|
||||
if(i < len)
|
||||
{
|
||||
PTR8[i] = tmp[2];
|
||||
}
|
||||
}
|
||||
}
|
||||
FMC_DISABLE_SP_UPDATE();
|
||||
FMC_Close();
|
||||
SYS_LockReg();
|
||||
|
||||
#undef TMP
|
||||
#undef PTR8
|
||||
#undef PTR32
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file drv_flash.h
|
||||
* @brief FLASH¶Áд
|
||||
*
|
||||
* @history - V1.0, 2017-03-10, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
#ifndef __DRV_FLASH_H
|
||||
#define __DRV_FLASH_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
#include "Mini58Series.h"
|
||||
|
||||
void flash_pan159_erase(uint32_t addr, uint16_t sectors);
|
||||
void flash_pan159_write(uint32_t addr, void* p_data, uint16_t len);
|
||||
void flash_pan159_read(uint32_t addr, void* p_data, uint16_t len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __DRV_FLASH_H
|
||||
@@ -0,0 +1,51 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file lib_driver_gpio_pan159.c
|
||||
* @brief PAN159 hardware gpioÇý¶¯
|
||||
*
|
||||
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
|
||||
*******************************************************************************/
|
||||
|
||||
#include "lib_driver_gpio_pan159.h"
|
||||
typedef void (*TCallback)(void);
|
||||
static void (*__s_lib_driver_EINT1_pan159_irq_handler)(void) = NULL;
|
||||
static void (*__s_lib_driver_EINT0_pan159_irq_handler)(void) = NULL;
|
||||
void gpio_ext1_int_init(TCallback cbk)
|
||||
{
|
||||
if(cbk){
|
||||
GPIO_EnableEINT1(P5, 2, GPIO_INT_FALLING);
|
||||
NVIC_EnableIRQ(EINT1_IRQn);
|
||||
}
|
||||
__s_lib_driver_EINT1_pan159_irq_handler = cbk;
|
||||
}
|
||||
void gpio_ext0_int_init(TCallback cbk)
|
||||
{
|
||||
GPIO_SetMode(P3, BIT2, GPIO_MODE_INPUT);
|
||||
if(cbk){
|
||||
GPIO_EnableEINT1(P3, 2, GPIO_INT_FALLING);
|
||||
NVIC_EnableIRQ(EINT0_IRQn);
|
||||
}
|
||||
__s_lib_driver_EINT0_pan159_irq_handler = cbk;
|
||||
}
|
||||
|
||||
void EINT0_IRQHandler(void)
|
||||
{
|
||||
/* For P3.2, clear the INT flag */
|
||||
P3->INTSRC = BIT2;
|
||||
if(__s_lib_driver_EINT0_pan159_irq_handler){
|
||||
__s_lib_driver_EINT0_pan159_irq_handler();
|
||||
}
|
||||
|
||||
}
|
||||
void EINT1_IRQHandler(void)
|
||||
{
|
||||
/* For P5.2, clear the INT flag */
|
||||
P5->INTSRC = BIT2;
|
||||
if(__s_lib_driver_EINT1_pan159_irq_handler){
|
||||
__s_lib_driver_EINT1_pan159_irq_handler();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file lib_driver_gpio_pan159.c
|
||||
* @brief PAN159 hardware gpioÇý¶¯
|
||||
*
|
||||
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
|
||||
*******************************************************************************/
|
||||
#ifndef __LIB_DRIVER_GPIO_PAN159_H
|
||||
#define __LIB_DRIVER_GPIO_PAN159_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
|
||||
#include "Mini58Series.h"
|
||||
typedef void (*TCallback)(void);
|
||||
void gpio_ext1_int_init(TCallback cbk);
|
||||
void gpio_ext0_int_init(TCallback cbk);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif //__LIB_DRIVER_GPIO_PAN159_H
|
||||
@@ -0,0 +1,216 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file lib_driver_iic_pan159.c
|
||||
* @brief PAN159 hardware IICÇý¶¯
|
||||
*
|
||||
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
|
||||
*******************************************************************************/
|
||||
#include "lib_driver_iic_pan159.h"
|
||||
//#include <string.h>
|
||||
|
||||
uint8_t g_u8DeviceAddr;
|
||||
uint8_t g_u8RegAddr;
|
||||
//uint8_t g_au8TxData[64];
|
||||
//uint8_t g_u8RxData[64];
|
||||
uint8_t g_u8DataLen;
|
||||
uint8_t g_u8DataLenMax;
|
||||
uint8_t __IO g_u8EndFlag = 0;
|
||||
typedef void (*TCallback)(void);
|
||||
typedef void (*I2C_FUNC)(uint32_t u32Status,uint8_t *buf,TCallback cbk, TCallback fail_cbk);
|
||||
|
||||
I2C_FUNC __IO s_I2CHandlerFn = NULL;
|
||||
TCallback __IO cbk_success = NULL;
|
||||
TCallback __IO cbk_failed = NULL;
|
||||
uint8_t* buf_addr = NULL;
|
||||
/*---------------------------------------------------------------------------------------------------------*/
|
||||
/* I2C IRQ Handler */
|
||||
/*---------------------------------------------------------------------------------------------------------*/
|
||||
void I2C0_IRQHandler(void)
|
||||
{
|
||||
uint32_t u32Status;
|
||||
|
||||
u32Status = I2C_GET_STATUS(I2C0);
|
||||
|
||||
if (I2C_GET_TIMEOUT_FLAG(I2C0)) {
|
||||
/* Clear I2C Timeout Flag */
|
||||
I2C_ClearTimeoutFlag(I2C0);
|
||||
}
|
||||
else {
|
||||
if (s_I2CHandlerFn != NULL)
|
||||
s_I2CHandlerFn(u32Status,buf_addr,cbk_success,cbk_failed);
|
||||
}
|
||||
}
|
||||
|
||||
void iic_pan159_init(void)
|
||||
{
|
||||
//uint32_t u32Div;
|
||||
|
||||
CLK_EnableModuleClock(I2C0_MODULE);
|
||||
SYS->P3_MFP &= ~SYS_MFP_P34_Msk;
|
||||
SYS->P3_MFP |= SYS_MFP_P34_I2C0_SDA;
|
||||
SYS->P3_MFP &= ~SYS_MFP_P35_Msk;
|
||||
SYS->P3_MFP |= SYS_MFP_P35_I2C0_SCL;
|
||||
|
||||
SYS->IPRST1 |= SYS_IPRST1_I2C0RST_Msk;
|
||||
SYS->IPRST1 &= ~SYS_IPRST1_I2C0RST_Msk;
|
||||
|
||||
I2C_Open(I2C0,400000);
|
||||
// u32Div = (uint32_t) (((SystemCoreClock * 10)/(400000 * 4) + 5) / 10 - 1); /* Compute proper divider for I2C clock */
|
||||
// I2C0->CLKDIV = u32Div;
|
||||
// I2C0->CTL |= I2C_CTL_I2CEN_Msk;
|
||||
|
||||
I2C0->CTL |= I2C_CTL_INTEN_Msk;
|
||||
NVIC_EnableIRQ(I2C0_IRQn);
|
||||
|
||||
}
|
||||
|
||||
void iic_master_tx(uint32_t u32Status ,uint8_t *buf, TCallback cbk, TCallback fail_cbk)
|
||||
{
|
||||
if (u32Status == 0x08) { /* START has been transmitted */
|
||||
I2C_SET_DATA(I2C0, g_u8DeviceAddr << 1); /* Write SLA+W to Register I2CDAT */
|
||||
I2C_SET_CONTROL_REG(I2C0, I2C_SI);
|
||||
}
|
||||
else if (u32Status == 0x18) { /* SLA+W has been transmitted and ACK has been received */
|
||||
I2C_SET_DATA(I2C0, g_u8RegAddr);
|
||||
I2C_SET_CONTROL_REG(I2C0, I2C_SI);
|
||||
}
|
||||
else if (u32Status == 0x20) { /* SLA+W has been transmitted and NACK has been received */
|
||||
I2C_SET_CONTROL_REG(I2C0, I2C_STO | I2C_SI);
|
||||
}
|
||||
else if (u32Status == 0x28) { /* DATA has been transmitted and ACK has been received */
|
||||
if (g_u8DataLen != g_u8DataLenMax) {
|
||||
I2C_SET_DATA(I2C0, buf[g_u8DataLen++]);
|
||||
I2C_SET_CONTROL_REG(I2C0, I2C_SI);
|
||||
} else {
|
||||
I2C_SET_CONTROL_REG(I2C0, I2C_STO | I2C_SI);
|
||||
g_u8EndFlag = 1;
|
||||
if(cbk != NULL)
|
||||
{
|
||||
cbk();
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(fail_cbk != NULL)
|
||||
{
|
||||
fail_cbk();
|
||||
}
|
||||
//I2C_STOP(I2C0);
|
||||
//(I2C0)->CTL |= (I2C_CTL_SI_Msk | I2C_CTL_STO_Msk);
|
||||
/* TO DO */
|
||||
// printf("Status 0x%x is NOT processed\n", u32Status);
|
||||
}
|
||||
}
|
||||
void iic_master_rx(uint32_t u32Status ,uint8_t *buf,TCallback cbk, TCallback fail_cbk){
|
||||
if (u32Status == 0x08) { /* START has been transmitted and prepare SLA+W */
|
||||
I2C_SET_DATA(I2C0, g_u8DeviceAddr << 1); /* Write SLA+W to Register I2CDAT */
|
||||
I2C_SET_CONTROL_REG(I2C0, I2C_SI);
|
||||
}
|
||||
else if (u32Status == 0x18) { /* SLA+W has been transmitted and ACK has been received */
|
||||
I2C_SET_DATA(I2C0, g_u8RegAddr);
|
||||
I2C_SET_CONTROL_REG(I2C0, I2C_SI);
|
||||
}
|
||||
else if (u32Status == 0x20) { /* SLA+W has been transmitted and NACK has been received */
|
||||
I2C_SET_CONTROL_REG(I2C0, I2C_STO | I2C_SI);
|
||||
}
|
||||
else if (u32Status == 0x28) { /* DATA has been transmitted and ACK has been received */
|
||||
I2C_SET_CONTROL_REG(I2C0, I2C_STA | I2C_SI);
|
||||
}
|
||||
else if (u32Status == 0x10) { /* Repeat START has been transmitted and prepare SLA+R */
|
||||
I2C_SET_DATA(I2C0, ((g_u8DeviceAddr << 1) | 0x01)); /* Write SLA+R to Register I2CDAT */
|
||||
I2C_SET_CONTROL_REG(I2C0, I2C_SI);
|
||||
}
|
||||
else if (u32Status == 0x40) { /* SLA+R has been transmitted and ACK has been received */
|
||||
if(g_u8DataLenMax== 1)
|
||||
{
|
||||
I2C_SET_CONTROL_REG(I2C0, I2C_SI );
|
||||
}
|
||||
else{
|
||||
I2C_SET_CONTROL_REG(I2C0, I2C_SI | I2C_AA );
|
||||
}
|
||||
}
|
||||
else if (u32Status == 0x50) { /* DATA has been received and ACK has been returned */
|
||||
if(g_u8DataLen != g_u8DataLenMax-2){
|
||||
buf[g_u8DataLen++] = I2C_GET_DATA(I2C0);
|
||||
I2C_SET_CONTROL_REG(I2C0, I2C_SI | I2C_AA);
|
||||
}
|
||||
else{
|
||||
buf[g_u8DataLen++] = I2C_GET_DATA(I2C0);
|
||||
I2C_SET_CONTROL_REG(I2C0, I2C_SI );
|
||||
}
|
||||
}
|
||||
else if (u32Status == 0x58) { /* DATA has been received and NACK has been returned */
|
||||
buf[g_u8DataLen++] = I2C_GET_DATA(I2C0);
|
||||
I2C_SET_CONTROL_REG(I2C0, I2C_STO | I2C_SI);
|
||||
g_u8EndFlag = 1;
|
||||
if(cbk != NULL)
|
||||
{
|
||||
cbk();
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(fail_cbk != NULL)
|
||||
{
|
||||
fail_cbk();
|
||||
}
|
||||
//(I2C0)->CTL |= (I2C_CTL_SI_Msk | I2C_CTL_STO_Msk);
|
||||
//I2C_STOP(I2C0);
|
||||
/* TO DO */
|
||||
//printf("Status 0x%x is NOT processed\n", u32Status);
|
||||
}
|
||||
}
|
||||
|
||||
void iic_start_send_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk)
|
||||
{
|
||||
I2C0->CTL |= I2C_CTL_I2CEN_Msk;
|
||||
|
||||
I2C0->CTL |= I2C_CTL_INTEN_Msk;
|
||||
g_u8DataLenMax = len;
|
||||
g_u8DeviceAddr = devAddr;
|
||||
|
||||
g_u8RegAddr = regAddr;
|
||||
|
||||
g_u8DataLen = 0;
|
||||
g_u8EndFlag = 0;
|
||||
/* I2C function to write data to slave */
|
||||
s_I2CHandlerFn = (I2C_FUNC)iic_master_tx;
|
||||
cbk_success = cbk;
|
||||
cbk_failed = fail_cbk;
|
||||
buf_addr = buf;
|
||||
/* I2C as master sends START signal */
|
||||
I2C_START(I2C0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void iic_start_read_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk)
|
||||
{
|
||||
I2C0->CTL |= I2C_CTL_I2CEN_Msk;
|
||||
|
||||
I2C0->CTL |= I2C_CTL_INTEN_Msk;
|
||||
g_u8DataLenMax = len;
|
||||
g_u8DeviceAddr = devAddr;
|
||||
g_u8RegAddr = regAddr;
|
||||
g_u8DataLen = 0;
|
||||
g_u8EndFlag = 0;
|
||||
s_I2CHandlerFn = (I2C_FUNC)iic_master_rx;
|
||||
cbk_success = cbk;
|
||||
cbk_failed = fail_cbk;
|
||||
buf_addr = buf;
|
||||
//CLK_SysTickDelay(5000);
|
||||
/* I2C as master sends START signal */
|
||||
I2C_START(I2C0);
|
||||
//while (g_u8EndFlag == 0);
|
||||
}
|
||||
|
||||
uint8_t is_iic_busy(void)
|
||||
{
|
||||
if(g_u8EndFlag){
|
||||
return 0;
|
||||
}
|
||||
else{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file lib_driver_iic_pan159.c
|
||||
* @brief PAN159 hardware IICÇý¶¯
|
||||
*
|
||||
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
|
||||
*******************************************************************************/
|
||||
#ifndef __LIB_DIRVER_IIC_PAN159_H
|
||||
#define __LIB_DIRVER_IIC_PAN159_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
|
||||
#include "Mini58Series.h"
|
||||
typedef void (*TCallback)(void);
|
||||
void iic_pan159_init(void);
|
||||
void iic_start_send_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk);
|
||||
void iic_start_read_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk);
|
||||
uint8_t is_iic_busy(void);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __LIB_DIRVER_IIC_PAN159_H
|
||||
@@ -0,0 +1,166 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file drv_pwm.c
|
||||
* @brief PWM驱动
|
||||
* ----------+----------+----------+----------
|
||||
* PWM0_CH0 | | P1.2(8) | P2.2(24)
|
||||
* ----------+----------+----------+----------
|
||||
* PWM0_CH1 | | P1.3(9) | P2.3(25)
|
||||
* ----------+----------+----------+----------
|
||||
* PWM0_CH2 | | | P2.4(26)
|
||||
* ----------+----------+----------+----------
|
||||
* PWM0_CH3 | | | P2.5(27)
|
||||
* ----------+----------+----------+----------
|
||||
* PWM0_CH4 | | P1.4(10) | P2.6(28)
|
||||
* ----------+----------+----------+----------
|
||||
* PWM0_CH5 | P0.4(15) | |
|
||||
* ----------+----------+----------+----------
|
||||
*
|
||||
* @history - V1.0, 2017-04-20, xiaoguolin, first implementation.
|
||||
* @history - V1.1, 2018-01-18, huoweibin, add pwm_pan159_setDuty.
|
||||
*******************************************************************************/
|
||||
#include "lib_driver_pwm_pan159.h"
|
||||
|
||||
// <0x50=>PWM0_CH0_P12 (CHIP_PIN_8)
|
||||
// <0x90=>PWM0_CH0_P22 (CHIP_PIN_24)
|
||||
// <0x59=>PWM0_CH1_P13 (CHIP_PIN_9)
|
||||
// <0x99=>PWM0_CH1_P23 (CHIP_PIN_25)
|
||||
// <0xA2=>PWM0_CH2_P24 (CHIP_PIN_26)
|
||||
// <0xAB=>PWM0_CH3_P25 (CHIP_PIN_27)
|
||||
// <0x64=>PWM0_CH4_P14 (CHIP_PIN_10)
|
||||
// <0xB4=>PWM0_CH4_P26 (CHIP_PIN_28)
|
||||
// <0x25=>PWM0_CH5_P04 (CHIP_PIN_15)
|
||||
//#define __PWM_PAN159_M0 0xA2 //P24
|
||||
//#define __PWM_PAN159_M1 0x99 //P23
|
||||
//#define __PWM_PAN159_M2 0x90 //P22
|
||||
//#define __PWM_PAN159_M3 0xAB //P25
|
||||
/*******************************************************************************
|
||||
* @brief PWM初始化
|
||||
* @param[in]
|
||||
* @return 1 - 成功
|
||||
* 0 - 失败
|
||||
* @history - V1.0, 2017-09-12, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
void pwm_pan159_init(uint8_t psc)
|
||||
{
|
||||
//const uint32_t pwmch_module[] = {PWMCH01_MODULE,PWMCH23_MODULE,PWMCH45_MODULE};
|
||||
SYS_UnlockReg();
|
||||
CLK_EnableModuleClock(PWMCH01_MODULE); //moudle clk enable ch01
|
||||
CLK_EnableModuleClock(PWMCH23_MODULE); //moudle clk enable ch23
|
||||
// CLK_SetModuleClock(PWMCH01_MODULE,CLK_CLKSEL1_PWMCH01SEL_HCLK,0);//时钟1分频
|
||||
// CLK_SetModuleClock(PWMCH23_MODULE,CLK_CLKSEL1_PWMCH23SEL_HCLK,0);//时钟1分频
|
||||
//CLK_EnableModuleClock(PWMCH45_MODULE); //moudle clk enable ch45
|
||||
// CLK_EnableModuleClock(pwmch_module[0x03 >> 1]); //moudle clk enable ch3
|
||||
SystemCoreClockUpdate();
|
||||
SYS_LockReg();
|
||||
//P22
|
||||
SYS->P2_MFP &= ~SYS_MFP_P22_Msk;
|
||||
SYS->P2_MFP |= SYS_MFP_P22_PWM0_CH0;
|
||||
PWM->CTL |= PWM_CTL_CNTEN0_Msk | PWM_CTL_CNTMODE0_Msk;
|
||||
//P23
|
||||
SYS->P2_MFP &= ~SYS_MFP_P23_Msk;
|
||||
SYS->P2_MFP |= SYS_MFP_P23_PWM0_CH1;
|
||||
PWM->CTL |= PWM_CTL_CNTEN1_Msk | PWM_CTL_CNTMODE1_Msk;
|
||||
//P24
|
||||
SYS->P2_MFP &= ~SYS_MFP_P24_Msk;
|
||||
SYS->P2_MFP |= SYS_MFP_P24_PWM0_CH2;
|
||||
PWM->CTL |= PWM_CTL_CNTEN2_Msk | PWM_CTL_CNTMODE2_Msk;
|
||||
//P25
|
||||
SYS->P2_MFP &= ~SYS_MFP_P25_Msk;
|
||||
SYS->P2_MFP |= SYS_MFP_P25_PWM0_CH3;
|
||||
PWM->CTL |= PWM_CTL_CNTEN3_Msk | PWM_CTL_CNTMODE3_Msk;
|
||||
|
||||
PWM_SET_PRESCALER(PWM,0x02,psc);
|
||||
PWM_SET_DIVIDER(PWM,0x02,PWM_CLK_DIV_1);
|
||||
//PWM_SET_ALIGNED_TYPE(PWM,0x02,0x80000000);//中心对齐
|
||||
PWM_SET_ALIGNED_TYPE(PWM,0x02,PWM_EDGE_ALIGNED);//边沿对齐
|
||||
PWM_SET_CMR(PWM,0x02,0);
|
||||
PWM_SET_CNR(PWM,0x02,1000);//PWM RANGE setting
|
||||
//PWM->CTL |= 1 << (PWM_CTL_PINV0_Pos + (((uint32_t)(0x02)) << 2));//输出取反
|
||||
|
||||
PWM_SET_PRESCALER(PWM,0x01,psc);
|
||||
PWM_SET_DIVIDER(PWM,0x01,PWM_CLK_DIV_1);
|
||||
PWM_SET_ALIGNED_TYPE(PWM,0x01,PWM_EDGE_ALIGNED);
|
||||
PWM_SET_CMR(PWM,0x01,0);
|
||||
PWM_SET_CNR(PWM,0x01,1000);//PWM RANGE setting
|
||||
//PWM->CTL |= 1 << (PWM_CTL_PINV0_Pos + (((uint32_t)(0x01)) << 2));//输出取反
|
||||
|
||||
PWM_SET_PRESCALER(PWM,0x00,psc);
|
||||
PWM_SET_DIVIDER(PWM,0x00,PWM_CLK_DIV_1);
|
||||
PWM_SET_ALIGNED_TYPE(PWM,0x00,PWM_EDGE_ALIGNED);
|
||||
PWM_SET_CMR(PWM,0x00,0);
|
||||
PWM_SET_CNR(PWM,0x00,1000);//PWM RANGE setting
|
||||
//PWM->CTL |= 1 << (PWM_CTL_PINV0_Pos + (((uint32_t)(0x00)) << 2));//输出取反
|
||||
|
||||
PWM_SET_PRESCALER(PWM,0x03,psc);
|
||||
PWM_SET_DIVIDER(PWM,0x03,PWM_CLK_DIV_1);
|
||||
PWM_SET_ALIGNED_TYPE(PWM,0x03,PWM_EDGE_ALIGNED);
|
||||
PWM_SET_CMR(PWM,0x03,0);
|
||||
PWM_SET_CNR(PWM,0x03,1000);//PWM RANGE setting
|
||||
//PWM->CTL |= 1 << (PWM_CTL_PINV0_Pos + (((uint32_t)(0x03)) << 2));//输出取反
|
||||
|
||||
/* 开启PWM */
|
||||
PWM->CTL |= PWM_CTL_CNTEN0_Msk << (((uint32_t)0x00) << 2);
|
||||
PWM->CTL |= PWM_CTL_CNTEN0_Msk << (((uint32_t)0x01) << 2);
|
||||
PWM->CTL |= PWM_CTL_CNTEN0_Msk << (((uint32_t)0x02) << 2);
|
||||
PWM->CTL |= PWM_CTL_CNTEN0_Msk << (((uint32_t)0x03) << 2);
|
||||
|
||||
PWM_PAN159_CHN_OUT(0x00,0);
|
||||
PWM_PAN159_CHN_OUT(0x01,0);
|
||||
PWM_PAN159_CHN_OUT(0x02,0);
|
||||
PWM_PAN159_CHN_OUT(0x03,0);
|
||||
//PWM_PAN159_CHN_UNLOCK(1<<chn);
|
||||
|
||||
|
||||
// return pwm_port;
|
||||
}
|
||||
/*******************************************************************************
|
||||
* @brief PWM输出
|
||||
* @param[in]
|
||||
* @return
|
||||
* @history - V1.0, 2018-01-18, huoweibin, first implementation.
|
||||
*******************************************************************************/
|
||||
void pwm_pan159_setDuty(uint16_t *duty)
|
||||
{
|
||||
register uint8_t lock = 0x00;
|
||||
register uint8_t unlock = 0x00;
|
||||
/*M1 - CH1 PWM out*/
|
||||
PWM_PAN159_CHN_OUT(0x01,duty[0]);
|
||||
if(duty[0] == 0){
|
||||
lock |= 1 << 0x01;
|
||||
}
|
||||
else{
|
||||
unlock |= 1 << 0x01;
|
||||
}
|
||||
/*M2 - CH3 PWM out*/
|
||||
PWM_PAN159_CHN_OUT(0x03,duty[1]);
|
||||
if(duty[1] == 0){
|
||||
lock |= 1 << 0x03;
|
||||
}
|
||||
else{
|
||||
unlock |= 1 << 0x03;
|
||||
}
|
||||
/*M3 - CH2 PWM out*/
|
||||
PWM_PAN159_CHN_OUT(0x02,duty[2]);
|
||||
if(duty[2] == 0){
|
||||
lock |= 1 << 0x02;
|
||||
}
|
||||
else{
|
||||
unlock |= 1 << 0x02;
|
||||
}
|
||||
/*M4 - CH0 PWM out*/
|
||||
PWM_PAN159_CHN_OUT(0x00,duty[3]);
|
||||
if(duty[3] == 0){
|
||||
lock |= 1 << 0x00;
|
||||
}
|
||||
else{
|
||||
unlock |= 1 << 0x00;
|
||||
}
|
||||
PWM_PAN159_CHN_LOCK(lock);
|
||||
PWM_PAN159_CHN_UNLOCK(unlock);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file drv_pwm.h
|
||||
* @brief PWM驱动
|
||||
* 机体坐标系(z朝下,x为机头,y为右侧):
|
||||
*
|
||||
* PWM对应的IO口:
|
||||
* ----------+----------+----------+----------
|
||||
* PWM0_CH0 | | P1.2(8) | P2.2(24)
|
||||
* ----------+----------+----------+----------
|
||||
* PWM0_CH1 | | P1.3(9) | P2.3(25)
|
||||
* ----------+----------+----------+----------
|
||||
* PWM0_CH2 | | | P2.4(26)
|
||||
* ----------+----------+----------+----------
|
||||
* PWM0_CH3 | | | P2.5(27)
|
||||
* ----------+----------+----------+----------
|
||||
* PWM0_CH4 | | P1.4(10) | P2.6(28)
|
||||
* ----------+----------+----------+----------
|
||||
* PWM0_CH5 | P0.4(15) | |
|
||||
* ----------+----------+----------+----------
|
||||
*
|
||||
* @history - V1.0, 2017-04-20, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
#ifndef __LIB_DIRVER_PWM_PAN159_H
|
||||
#define __LIB_DIRVER_PWM_PAN159_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
|
||||
#include "Mini58Series.h"
|
||||
|
||||
#define __PWM_PAN159_PORT(P) ((P)<<6)
|
||||
#define __PWM_PAN159_PIN(B) ((B)<<3)
|
||||
#define __PWM_PAN159_CHN(C) ((C)<<0)
|
||||
|
||||
#define PWM_PAN159_PWM0_CH0_P12 (__PWM_PAN159_CHN(0)|__PWM_PAN159_PORT(1)|__PWM_PAN159_PIN(2)) /* 01 010 000 = 0x50 */
|
||||
#define PWM_PAN159_PWM0_CH0_P22 (__PWM_PAN159_CHN(0)|__PWM_PAN159_PORT(2)|__PWM_PAN159_PIN(2)) /* 10 010 000 = 0x90 */
|
||||
#define PWM_PAN159_PWM0_CH1_P13 (__PWM_PAN159_CHN(1)|__PWM_PAN159_PORT(1)|__PWM_PAN159_PIN(3)) /* 01 011 001 = 0x59 */
|
||||
#define PWM_PAN159_PWM0_CH1_P23 (__PWM_PAN159_CHN(1)|__PWM_PAN159_PORT(2)|__PWM_PAN159_PIN(3)) /* 10 011 001 = 0x99 */
|
||||
#define PWM_PAN159_PWM0_CH2_P24 (__PWM_PAN159_CHN(2)|__PWM_PAN159_PORT(2)|__PWM_PAN159_PIN(4)) /* 10 100 010 = 0xA2 */
|
||||
#define PWM_PAN159_PWM0_CH3_P25 (__PWM_PAN159_CHN(3)|__PWM_PAN159_PORT(2)|__PWM_PAN159_PIN(5)) /* 10 101 011 = 0xAB */
|
||||
#define PWM_PAN159_PWM0_CH4_P14 (__PWM_PAN159_CHN(4)|__PWM_PAN159_PORT(1)|__PWM_PAN159_PIN(4)) /* 01 100 100 = 0x64 */
|
||||
#define PWM_PAN159_PWM0_CH4_P26 (__PWM_PAN159_CHN(4)|__PWM_PAN159_PORT(2)|__PWM_PAN159_PIN(6)) /* 10 110 100 = 0xB4 */
|
||||
#define PWM_PAN159_PWM0_CH5_P04 (__PWM_PAN159_CHN(5)|__PWM_PAN159_PORT(0)|__PWM_PAN159_PIN(4)) /* 00 100 101 = 0x25 */
|
||||
|
||||
#define PWM_PAN159_PORT_MSK __PWM_PAN159_PORT(0x03)
|
||||
#define PWM_PAN159_PIN_MSK __PWM_PAN159_PIN(0x07)
|
||||
#define PWM_PAN159_CHN_MSK __PWM_PAN159_CHN(0x07)
|
||||
|
||||
#define PWM_PAN159_PORT(PWMx) ((PWMx)>>6)
|
||||
#define PWM_PAN159_PIN(PWMx) (((PWMx)&PWM_PAN159_PIN_MSK)>>3)
|
||||
#define PWM_PAN159_CHN(PWMx) ((PWMx)&PWM_PAN159_CHN_MSK)
|
||||
|
||||
#define PWM_PAN159_CMPDAT ((volatile uint32_t*)(0x40040000+0x24))
|
||||
#define PWM_PAN159_OEN (*(volatile uint32_t*)(0x40040000+0x5C))
|
||||
|
||||
#define PWM_PAN159_CHN_ISLOCKED(CHN_BITS) (PWM_PAN159_OEN&(CHN_BITS))
|
||||
#define PWM_PAN159_CHN_LOCK(CHN_BITS) (PWM_PAN159_OEN&=~(CHN_BITS))
|
||||
#define PWM_PAN159_CHN_UNLOCK(CHN_BITS) (PWM_PAN159_OEN|=(CHN_BITS))
|
||||
#define PWM_PAN159_CHN_OUT(CHN,VAL) (PWM_PAN159_CMPDAT[(CHN)]=(VAL))
|
||||
|
||||
#define pwm_pan159_islocked(pwm_port) PWM_PAN159_CHN_ISLOCK(1<<PWM_PAN159_CHN((pwm_port)))
|
||||
#define pwm_pan159_lock(pwm_port) PWM_PAN159_CHN_LOCK(1<<PWM_PAN159_CHN((pwm_port)))
|
||||
#define pwm_pan159_unlock(pwm_port) PWM_PAN159_CHN_UNLOCK(1<<PWM_PAN159_CHN((pwm_port)))
|
||||
#define pwm_pan159_out(pwm_port,val) PWM_PAN159_CHN_OUT(PWM_PAN159_CHN((pwm_port)),val)
|
||||
//uint8_t pwm_pan159_init(uint8_t pwm_port,uint8_t psc,uint8_t div,uint32_t align,uint32_t cnt,uint8_t inv);
|
||||
void pwm_pan159_init(uint8_t psc);
|
||||
void pwm_pan159_setDuty(uint16_t *duty);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __LIB_DIRVER_PWM_PAN159_H
|
||||
@@ -0,0 +1,70 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file drv_spi.c
|
||||
* @brief SPI?y?ˉ
|
||||
*
|
||||
* @history - V1.0, 2017-03-06, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
#include "lib_driver_rfspi_pan159.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief SPI初始化
|
||||
* @param[in] 无
|
||||
* @param[out] 无
|
||||
* @return 无
|
||||
******************************************************************************/
|
||||
void rfspi_pan159_init(void)
|
||||
{
|
||||
SYS->P0_MFP |= SYS_MFP_P01_GPIO; // P01->RF_CSN
|
||||
SYS->P0_MFP |= SYS_MFP_P07_SPI0_CLK|SYS_MFP_P05_SPI0_MOSI|SYS_MFP_P06_SPI0_MISO ;
|
||||
SYS->P5_MFP |= SYS_MFP_P52_GPIO; //P20->RF_IRQ
|
||||
|
||||
CLK_EnableModuleClock(SPI0_MODULE);//使能SPI时钟
|
||||
CLK_SetModuleClock(SPI0_MODULE,CLK_CLKSEL1_SPISEL_HCLK,1);//时钟1分频
|
||||
|
||||
GPIO_SetMode(P0, BIT1, GPIO_MODE_OUTPUT); //RF_CSN
|
||||
GPIO_SetMode(P5, BIT2, GPIO_MODE_INPUT); //RF_IRQ
|
||||
|
||||
SYS->P0_MFP |= SYS_MFP_P05_SPI0_MOSI | SYS_MFP_P06_SPI0_MISO | SYS_MFP_P07_SPI0_CLK;//设置IO复用功能
|
||||
SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0,8,2000000);//主设备,模式0,8位宽度,2M速率
|
||||
SPI_DisableAutoSS(SPI0);//禁止硬件SS脚
|
||||
SPI_WRITE_TX(SPI0, 0);//清除SPI数据
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief SPI字节读写
|
||||
* @param[in] dat - 待写入数据
|
||||
* @param[out] 无
|
||||
* @return 读取到的字节
|
||||
******************************************************************************/
|
||||
uint8_t rfspi_pan159_rwc(uint8_t dat)
|
||||
{
|
||||
SPI_WRITE_TX(SPI0, dat);
|
||||
SPI_TRIGGER(SPI0);
|
||||
while(SPI_IS_BUSY(SPI0));
|
||||
return SPI0->RX;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief SPI读写数据块
|
||||
* @param[in] p_dat - 数据指针
|
||||
* len - 数据长度
|
||||
* @param[out] 无
|
||||
* @return 读取到的数据块,与p_dat共缓冲区
|
||||
* @history - V1.0, 2017-03-06, xiaoguolin, first implementation.
|
||||
******************************************************************************/
|
||||
uint8_t* rfspi_pan159_rws(uint8_t* p_dat, uint16_t len)
|
||||
{
|
||||
uint8_t i = 0;
|
||||
while(i < len)
|
||||
{
|
||||
SPI_WRITE_TX(SPI0, p_dat[i]);
|
||||
SPI_TRIGGER(SPI0);
|
||||
while(SPI_IS_BUSY(SPI0));
|
||||
p_dat[i] = SPI0->RX;
|
||||
i++;
|
||||
}
|
||||
return p_dat;
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file drv_spi.h
|
||||
* @brief SPIÇý¶¯
|
||||
*
|
||||
* @history - V1.0, 2017-03-06, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
#ifndef __DRV_SPI_H
|
||||
#define __DRV_SPI_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
|
||||
#include "Mini58Series.h"
|
||||
|
||||
#define rfspi_pan159_irq() P52
|
||||
#define rfspi_pan159_cs(level) (P01=(level))
|
||||
void rfspi_pan159_init(void);
|
||||
uint8_t rfspi_pan159_rwc(uint8_t dat);
|
||||
uint8_t* rfspi_pan159_rws(uint8_t* p_dat, uint16_t len);
|
||||
|
||||
#define rfspi_ce(v) xn297l_write_reg(CE_FSPI_ON|(v), 0)
|
||||
#define rfspi_irq rfspi_pan159_irq
|
||||
#define rfspi_cs rfspi_pan159_cs
|
||||
#define rfspi_init rfspi_pan159_init
|
||||
#define rfspi_rwc rfspi_pan159_rwc
|
||||
#define rfspi_rws rfspi_pan159_rws
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __DRV_SPI_H
|
||||
@@ -0,0 +1,379 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file driver_swiic_pan159.c
|
||||
* @brief PAN159 GPIO IIC通用驱动
|
||||
*
|
||||
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
#include "lib_driver_swiic_pan159.h"
|
||||
#include "string.h"
|
||||
|
||||
#define __swiic_pan159_delay __delay_pan159
|
||||
|
||||
#define __swiic_pan159_mutex_lock(hiic) __disable_irq()
|
||||
#define __swiic_pan159_mutex_unlock(hiic) __enable_irq()
|
||||
|
||||
#define __swiic_pan159_read_sda(hiic) (*((hiic)->sda))
|
||||
#define __swiic_pan159_write_sda(hiic,val) (*((hiic)->sda)=(val))
|
||||
#define __swiic_pan159_write_scl(hiic,val) (*((hiic)->scl)=(val))
|
||||
|
||||
#define __swiic_pan159_set_speed(hiic,spd) ((hiic)->speed.code=(spd))
|
||||
#define __swiic_pan159_get_speed(hiic) ((hiic)->speed.code)
|
||||
|
||||
//#define __swiic_pan159_echo_wclk(hiic) \
|
||||
// do{ \
|
||||
// __swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
|
||||
// __swiic_pan159_write_scl((hiic),1); \
|
||||
// __swiic_pan159_delay((hiic)->scl_tim_code_h); \
|
||||
// __swiic_pan159_write_scl((hiic),0); \
|
||||
// __swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
|
||||
// }while(0)
|
||||
void __swiic_pan159_echo_wclk(const swiic_pan159_t* hiic)
|
||||
{
|
||||
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
|
||||
__swiic_pan159_write_scl(hiic,1);
|
||||
__swiic_pan159_delay(hiic->speed.scl_tim_code.h);
|
||||
__swiic_pan159_write_scl(hiic,0);
|
||||
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
|
||||
}
|
||||
|
||||
#define __swiic_pan159_echo_rclk(hiic,pret) \
|
||||
do{ \
|
||||
__swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
|
||||
__swiic_pan159_write_scl((hiic),1); \
|
||||
__swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
|
||||
*(pret) = __swiic_pan159_read_sda((hiic)); \
|
||||
__swiic_pan159_write_scl((hiic),0); \
|
||||
__swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
|
||||
}while(0)
|
||||
|
||||
/**
|
||||
* IIC START SIGNAL:
|
||||
* ___
|
||||
* SDA \_______
|
||||
* ______
|
||||
* SCL / \___
|
||||
*/
|
||||
//#define __swiic_pan159_start(hiic) \
|
||||
// do{ \
|
||||
// __swiic_pan159_write_sda((hiic),1); \
|
||||
// __swiic_pan159_write_scl((hiic),1); \
|
||||
// __swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
|
||||
// __swiic_pan159_write_sda((hiic),0); \
|
||||
// __swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
|
||||
// __swiic_pan159_write_scl((hiic),0); \
|
||||
// __swiic_pan159_delay((hiic)->speed.scl_tim_code.l); \
|
||||
// }while(0)
|
||||
void __swiic_pan159_start(const swiic_pan159_t* hiic)
|
||||
{
|
||||
__swiic_pan159_write_sda(hiic,1);
|
||||
__swiic_pan159_write_scl(hiic,1);
|
||||
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
|
||||
__swiic_pan159_write_sda(hiic,0);
|
||||
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
|
||||
__swiic_pan159_write_scl(hiic,0);
|
||||
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
|
||||
}
|
||||
|
||||
/**
|
||||
* IIC STOP SIGNAL:
|
||||
* ___
|
||||
* SDA ___/
|
||||
* ______
|
||||
* SCL /
|
||||
*/
|
||||
//#define __swiic_pan159_stop(hiic) \
|
||||
// do{ \
|
||||
// __swiic_pan159_write_sda((hiic),0); \
|
||||
// __swiic_pan159_write_scl((hiic),1); \
|
||||
// __swiic_pan159_delay((hiic)->scl_tim_code_l); \
|
||||
// __swiic_pan159_write_sda((hiic),1); \
|
||||
// }while(0)
|
||||
void __swiic_pan159_stop(const swiic_pan159_t* hiic)
|
||||
{
|
||||
__swiic_pan159_write_sda(hiic,0);
|
||||
__swiic_pan159_write_scl(hiic,1);
|
||||
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
|
||||
__swiic_pan159_write_sda(hiic,1);
|
||||
}
|
||||
|
||||
/**
|
||||
* IIC ACK SIGNAL:
|
||||
* _
|
||||
* SDA \___________/
|
||||
* ____
|
||||
* SCL ___/ \_____
|
||||
*/
|
||||
#define __swiic_pan159_write_ack(hiic) \
|
||||
do{ \
|
||||
__swiic_pan159_write_sda((hiic),0); \
|
||||
__swiic_pan159_echo_wclk((hiic)); \
|
||||
__swiic_pan159_write_sda((hiic),1); \
|
||||
}while(0)
|
||||
|
||||
/**
|
||||
* IIC NACK SIGNAL:
|
||||
* ____________
|
||||
* SDA
|
||||
* ____
|
||||
* SCL ___/ \___
|
||||
*/
|
||||
#define __swiic_pan159_write_nack(hiic) \
|
||||
do{ \
|
||||
__swiic_pan159_write_sda((hiic),1); \
|
||||
__swiic_pan159_echo_wclk((hiic)); \
|
||||
}while(0)
|
||||
|
||||
void __swiic_pan159_write_byte(const swiic_pan159_t *hiic, uint8_t _ubyte)
|
||||
{
|
||||
register uint8_t ubyte = _ubyte;
|
||||
register uint8_t i;
|
||||
for(i = 0; i < 8; i++){
|
||||
__swiic_pan159_write_sda(hiic,((ubyte & 0x80) ? 1 : 0));
|
||||
__swiic_pan159_echo_wclk(hiic);
|
||||
ubyte <<= 1;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t __swiic_pan159_read_byte(const swiic_pan159_t* hiic)
|
||||
{
|
||||
register uint8_t ubyte = 0;
|
||||
register uint8_t i;
|
||||
for(i = 0; i < 8; i++){
|
||||
ubyte <<= 1;
|
||||
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
|
||||
__swiic_pan159_write_scl(hiic,1);
|
||||
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
|
||||
ubyte |= __swiic_pan159_read_sda(hiic);
|
||||
__swiic_pan159_write_scl(hiic,0);
|
||||
__swiic_pan159_delay(hiic->speed.scl_tim_code.l);
|
||||
}
|
||||
return ubyte;
|
||||
}
|
||||
|
||||
uint8_t __swiic_pan159_read_ack(const swiic_pan159_t* hiic)
|
||||
{
|
||||
uint8_t ret;
|
||||
__swiic_pan159_write_sda(hiic,1);
|
||||
__swiic_pan159_echo_rclk(hiic,&ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief GPIO IIC初始化
|
||||
* @param[in] hiic - IIC设备句柄
|
||||
* iic_speed - IIC速率
|
||||
* sda_port_n - SDA端口号
|
||||
* sda_pin_n - SDA引脚号
|
||||
* scl_port_n - SCL端口号
|
||||
* scl_pin_n - SCL引脚号
|
||||
* @return 1 - 成功, 0 - 失败
|
||||
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
void swiic_pan159_init(swiic_pan159_t* hiic, uint32_t iic_speed,
|
||||
uint32_t sda_port_n, uint32_t sda_pin_n,
|
||||
uint32_t scl_port_n, uint32_t scl_pin_n)
|
||||
{
|
||||
hiic->sda = &GPIO_PIN_ADDR(sda_port_n,sda_pin_n);
|
||||
hiic->scl = &GPIO_PIN_ADDR(scl_port_n,scl_pin_n);
|
||||
/**
|
||||
* us * 6 - 4 = code
|
||||
* 时钟分布为 low : high = 2 : 1, 因此分为 3 份
|
||||
* ______
|
||||
* \______ ______/ \
|
||||
* low - 2 high - 1
|
||||
* 因此code = us * 2 - 1
|
||||
*/
|
||||
__swiic_pan159_set_speed(hiic, iic_speed);
|
||||
#define __PORT__(n) ((GPIO_T *) (AHBPERIPH_BASE + (0x04000 | ((n) << 6))))
|
||||
#define __PIN__(n) (1 << (n))
|
||||
GPIO_SetMode(__PORT__(sda_port_n),__PIN__(sda_pin_n),GPIO_MODE_OPEN_DRAIN);
|
||||
GPIO_SetMode(__PORT__(scl_port_n),__PIN__(scl_pin_n),GPIO_MODE_OPEN_DRAIN);
|
||||
#undef __PORT__
|
||||
#undef __PIN__
|
||||
__swiic_pan159_stop(hiic);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief GPIO IIC读取(该函数读取具有一定的风险,无法区分读取失败和读到0)
|
||||
* @param[in] dhiic - 目标IIC设备句柄
|
||||
* shiic - 源IIC设备句柄
|
||||
* iic_speed - IIC速率
|
||||
* @return 无
|
||||
* @history - V1.0, 2017-09-12, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
void swiic_pan159_copy(swiic_pan159_t* dhiic, const swiic_pan159_t* shiic, uint32_t iic_speed)
|
||||
{
|
||||
memcpy(dhiic,shiic,sizeof(swiic_pan159_t));
|
||||
if(iic_speed != SWIIC_PAN159_SPEED_SYS_48M_IIC_DEFAULT){
|
||||
__swiic_pan159_set_speed(dhiic,iic_speed);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief GPIO IIC读取(该函数读取具有一定的风险,无法区分读取失败和读到0)
|
||||
* @param[in] hiic - IIC设备句柄
|
||||
* iic_speed - IIC速率
|
||||
* dev - IIC设备地址
|
||||
* reg - 寄存器地址
|
||||
* @return 读取到的字节
|
||||
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
uint8_t swiic_pan159_read_byte(const swiic_pan159_t* hiic, uint8_t dev, uint8_t reg)
|
||||
{
|
||||
register uint8_t ret = 0;
|
||||
__swiic_pan159_mutex_lock(hiic); /* 锁定MUTEX */
|
||||
__swiic_pan159_start(hiic); /* 启动IIC */
|
||||
__swiic_pan159_write_byte(hiic,(dev << 1)|0); /* 写设备地址(写) */
|
||||
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
|
||||
__swiic_pan159_write_byte(hiic,reg); /* 写寄存器地址 */
|
||||
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
|
||||
__swiic_pan159_start(hiic); /* 重启IIC */
|
||||
__swiic_pan159_write_byte(hiic,(dev << 1)|1); /* 写设备地址(读) */
|
||||
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
|
||||
ret = __swiic_pan159_read_byte(hiic); /* 读取数据字节 */
|
||||
__swiic_pan159_write_nack(hiic); /* 回写NACK */
|
||||
} /* */
|
||||
} /* */
|
||||
} /* */
|
||||
__swiic_pan159_stop(hiic); /* 停止IIC */
|
||||
__swiic_pan159_mutex_unlock(hiic); /* 释放MUTEX */
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief GPIO IIC读取
|
||||
* @param[in] hiic - IIC设备句柄
|
||||
* iic_speed - IIC速率
|
||||
* dev - IIC设备地址
|
||||
* reg - 寄存器地址
|
||||
* len - 要读取的数据长度
|
||||
* @param[out] _buf - 数据缓冲区
|
||||
* @return 读取到的字节数
|
||||
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
uint32_t swiic_pan159_read_bytes(const swiic_pan159_t* hiic, uint8_t dev, uint8_t reg, uint8_t* buf, uint32_t len)
|
||||
{
|
||||
register uint32_t i = 0;
|
||||
__swiic_pan159_mutex_lock(hiic); /* 锁定MUTEX */
|
||||
__swiic_pan159_start(hiic); /* 启动IIC */
|
||||
__swiic_pan159_write_byte(hiic,(dev << 1)|0); /* 写设备地址(写) */
|
||||
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
|
||||
__swiic_pan159_write_byte(hiic,reg); /* 写寄存器地址 */
|
||||
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
|
||||
__swiic_pan159_start(hiic); /* 重启IIC */
|
||||
__swiic_pan159_write_byte(hiic,(dev << 1)|1); /* 写设备地址(读) */
|
||||
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
|
||||
for(len--; i < len; i++){ /* len中减掉读取数据中的最后一个字节 */
|
||||
buf[i] = __swiic_pan159_read_byte(hiic); /* 读取字节 */
|
||||
__swiic_pan159_write_ack(hiic); /* 回写ACK */
|
||||
} /* */
|
||||
buf[i++] = __swiic_pan159_read_byte(hiic); /* 读取最后一个字节 */
|
||||
__swiic_pan159_write_nack(hiic); /* 回写NACK */
|
||||
} /* */
|
||||
} /* */
|
||||
} /* */
|
||||
__swiic_pan159_stop(hiic); /* 停止IIC */
|
||||
__swiic_pan159_mutex_unlock(hiic); /* 释放MUTEX */
|
||||
return i;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief GPIO IIC写入
|
||||
* @param[in] hiic - IIC设备句柄
|
||||
* iic_speed - IIC速率
|
||||
* dev - IIC设备地址
|
||||
* reg - 寄存器地址
|
||||
* ubyte - 待写入字节
|
||||
* @return 1 - 成功
|
||||
* 0 - 失败
|
||||
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
uint8_t swiic_pan159_write_byte(const swiic_pan159_t* hiic, uint8_t dev, uint8_t reg, uint8_t ubyte)
|
||||
{
|
||||
__swiic_pan159_mutex_lock(hiic); /* 锁定MUTEX */
|
||||
__swiic_pan159_start(hiic); /* 启动IIC */
|
||||
__swiic_pan159_write_byte(hiic,(dev << 1)|0); /* 写设备地址(写) */
|
||||
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
|
||||
__swiic_pan159_write_byte(hiic,reg); /* 写寄存器地址 */
|
||||
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
|
||||
__swiic_pan159_write_byte(hiic,ubyte); /* 写字节数据 */
|
||||
ubyte = (__swiic_pan159_read_ack(hiic) == 0) ? 1 : 0; /* 读取ACK */
|
||||
} /* */
|
||||
} /* */
|
||||
__swiic_pan159_stop(hiic); /* 停止IIC */
|
||||
__swiic_pan159_mutex_unlock(hiic); /* 释放MUTEX */
|
||||
return ubyte;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief GPIO IIC写入
|
||||
* @param[in] hiic - IIC设备句柄
|
||||
* iic_speed - IIC速率
|
||||
* dev - IIC设备地址
|
||||
* reg - 寄存器地址
|
||||
* buf - 数据缓冲区
|
||||
* len - 要写入的数据长度
|
||||
* @return 写入的字节数
|
||||
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
uint32_t swiic_pan159_write_bytes(const swiic_pan159_t* hiic, uint8_t dev, uint8_t reg, const uint8_t* buf, uint32_t len)
|
||||
{
|
||||
register uint32_t i = 0;
|
||||
__swiic_pan159_mutex_lock(hiic); /* 锁定MUTEX */
|
||||
__swiic_pan159_start(hiic); /* 启动IIC */
|
||||
__swiic_pan159_write_byte(hiic,(dev << 1)|0); /* 写设备地址(写) */
|
||||
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
|
||||
__swiic_pan159_write_byte(hiic,reg); /* 写寄存器地址 */
|
||||
if(__swiic_pan159_read_ack(hiic) == 0){ /* 读取ACK */
|
||||
for(; i < len; i++){ /* */
|
||||
__swiic_pan159_write_byte(hiic,buf[i]); /* 写字节数据 */
|
||||
if(__swiic_pan159_read_ack(hiic) != 0){ /* 读取ACK */
|
||||
break; /* */
|
||||
} /* */
|
||||
} /* */
|
||||
} /* */
|
||||
} /* */
|
||||
__swiic_pan159_stop(hiic); /* 停止IIC */
|
||||
__swiic_pan159_mutex_unlock(hiic); /* 释放MUTEX */
|
||||
return i;
|
||||
}
|
||||
|
||||
swiic_pan159_t imu_iic;
|
||||
swiic_pan159_t bar_iic;
|
||||
//typedef void (*TCallback)(void);
|
||||
void iic_pan159_init(void)
|
||||
{
|
||||
swiic_pan159_init(&imu_iic,0x00030003,3,4,3,5);
|
||||
swiic_pan159_copy(&bar_iic,&imu_iic,0x00030003);
|
||||
}
|
||||
|
||||
void iic_start_send_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk)
|
||||
{
|
||||
if(swiic_pan159_write_bytes(&imu_iic, devAddr, regAddr, buf, len)){
|
||||
if(cbk){
|
||||
cbk();
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(fail_cbk){
|
||||
fail_cbk();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void iic_start_read_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk)
|
||||
{
|
||||
if(swiic_pan159_read_bytes(&imu_iic, devAddr, regAddr, buf, len)){
|
||||
if(cbk){
|
||||
cbk();
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(fail_cbk){
|
||||
fail_cbk();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file driver_swiic_pan159.h
|
||||
* @brief PAN159 GPIO IIC通用驱动
|
||||
*
|
||||
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
#ifndef __DRIVER_SWIIC_PAN159_H
|
||||
#define __DRIVER_SWIIC_PAN159_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
|
||||
#include "lib_driver_delay_pan159.h"
|
||||
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_578K 0x00000000
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_540K 0x00010000
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_515K 0x00020000
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_476K 0x00010001
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_457K 0x00020001
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_426K 0x00020002
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_412K 0x00030002
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_397K 0x00040002
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_385K 0x00030003
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_373K 0x00040003
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_361K 0x00050003
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_351K 0x00060003
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_341K 0x00050004
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_331K 0x00060004
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_322K 0x00070004
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_313K 0x00060005
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_306K 0x00070005
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_298K 0x00080005
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_291K 0x00090005
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_284K 0x00080006
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_278K 0x00090006
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_271K 0x000A0006
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_265K 0x000B0006
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_259K 0x000C0006
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_254K 0x000D0006
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_249K 0x000C0007
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_244K 0x000D0007
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_239K 0x000E0007
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_234K 0x000F0007
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_230K 0x000E0008
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_225K 0x000F0008
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_220K 0x00100008
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_215K 0x00110008
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_200K 0x0010000B
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_190K 0x0011000C
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_181K 0x0010000E
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_171K 0x00100010
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_161K 0x00140010
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_151K 0x00190010
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_141K 0x001E0010
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_129K 0x001E0014
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_119K 0x001E0018
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_108K 0x001E001D
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_100K 0x00220020
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_81K 0x00380023
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_69K 0x00480028
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_54K 0x00580038
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_42K 0x00690050
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_31K 0x00880070
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_20K 0x010000A0
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_10K 0x02000160
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_1K 0x0FFF0F69
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_750 0x1A01123B
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_500 0x20001EDD
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_200 0x60004539
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_FASTEST 0x00000000
|
||||
#define SWIIC_PAN159_SPEED_SYS_48M_IIC_DEFAULT 0xFFFFFFFF
|
||||
|
||||
typedef struct{
|
||||
volatile uint32_t *sda;
|
||||
volatile uint32_t *scl;
|
||||
union{
|
||||
uint32_t code;
|
||||
struct{
|
||||
uint16_t l;
|
||||
uint16_t h;
|
||||
}scl_tim_code;
|
||||
}speed;
|
||||
}swiic_pan159_t;
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief GPIO IIC初始化
|
||||
* @param[in] hiic - IIC设备句柄
|
||||
* iic_speed - IIC速率
|
||||
* sda_port_n - SDA端口号
|
||||
* sda_pin_n - SDA引脚号
|
||||
* scl_port_n - SCL端口号
|
||||
* scl_pin_n - SCL引脚号
|
||||
* @return 无
|
||||
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
void swiic_pan159_init(swiic_pan159_t* hiic, uint32_t iic_speed,
|
||||
uint32_t sda_port_n, uint32_t sda_pin_n,
|
||||
uint32_t scl_port_n, uint32_t scl_pin_n);
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief GPIO IIC读取(该函数读取具有一定的风险,无法区分读取失败和读到0)
|
||||
* @param[in] dhiic - 目标IIC设备句柄
|
||||
* shiic - 源IIC设备句柄
|
||||
* iic_speed - IIC速率
|
||||
* @return 无
|
||||
* @history - V1.0, 2017-09-12, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
void swiic_pan159_copy(swiic_pan159_t* dhiic, const swiic_pan159_t* shiic,
|
||||
uint32_t iic_speed);
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief GPIO IIC读取(该函数读取具有一定的风险,无法区分读取失败和读到0)
|
||||
* @param[in] hiic - IIC设备句柄
|
||||
* dev - IIC设备地址
|
||||
* reg - 寄存器地址
|
||||
* @return 读取到的字节
|
||||
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
uint8_t swiic_pan159_read_byte(const swiic_pan159_t* hiic,
|
||||
uint8_t dev, uint8_t reg);
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief GPIO IIC读取
|
||||
* @param[in] hiic - IIC设备句柄
|
||||
* dev - IIC设备地址
|
||||
* reg - 寄存器地址
|
||||
* len - 要读取的数据长度
|
||||
* @param[out] _buf - 数据缓冲区
|
||||
* @return 读取到的字节数
|
||||
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
uint32_t swiic_pan159_read_bytes(const swiic_pan159_t* hiic,
|
||||
uint8_t dev, uint8_t reg,
|
||||
uint8_t* buf, uint32_t len);
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief GPIO IIC写入
|
||||
* @param[in] hiic - IIC设备句柄
|
||||
* dev - IIC设备地址
|
||||
* reg - 寄存器地址
|
||||
* ubyte - 待写入字节
|
||||
* @return 1 - 成功
|
||||
* 0 - 失败
|
||||
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
uint8_t swiic_pan159_write_byte(const swiic_pan159_t* hiic,
|
||||
uint8_t dev, uint8_t reg, uint8_t ubyte);
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief GPIO IIC写入
|
||||
* @param[in] hiic - IIC设备句柄
|
||||
* dev - IIC设备地址
|
||||
* reg - 寄存器地址
|
||||
* buf - 数据缓冲区
|
||||
* len - 要写入的数据长度
|
||||
* @return 写入的字节数
|
||||
* @history - V1.0, 2017-08-25, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
uint32_t swiic_pan159_write_bytes(const swiic_pan159_t* hiic,
|
||||
uint8_t dev, uint8_t reg,
|
||||
const uint8_t* buf, uint32_t len);
|
||||
|
||||
typedef void (*TCallback)(void);
|
||||
void iic_pan159_init(void);
|
||||
void iic_start_send_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk);
|
||||
void iic_start_read_bytes(uint16_t devAddr,uint8_t regAddr, uint8_t *buf, uint8_t len,TCallback cbk, TCallback fail_cbk);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __DRIVER_SWIIC_PAN159_H */
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file lib_driver_timer_pan159.c
|
||||
* @brief 定时器
|
||||
*
|
||||
* @history - V1.0, 2017-11-16, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
#include "lib_driver_timer_pan159.h"
|
||||
|
||||
static void (*__s_lib_driver_timer_pan159_irq_handler)(void) = NULL;
|
||||
static void (*__s_lib_driver_timer1_pan159_irq_handler)(void) = NULL;
|
||||
/*******************************************************************************
|
||||
* @brief 定时器0初始化
|
||||
* @param[in] 无
|
||||
* @param[out] 无
|
||||
* @return 无
|
||||
* @history - V1.0, 2017-03-07, xiaoguolin, first implementation.
|
||||
******************************************************************************/
|
||||
void timer_pan159_init(uint32_t freq, void(*irq_handler)(void))
|
||||
{
|
||||
CLK_EnableModuleClock(TMR0_MODULE);
|
||||
TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, freq);
|
||||
// Enable timer interrupt
|
||||
if(irq_handler){
|
||||
TIMER_EnableInt(TIMER0);
|
||||
NVIC_EnableIRQ(TMR0_IRQn);
|
||||
NVIC_SetPriority(TMR0_IRQn,2);
|
||||
}
|
||||
__s_lib_driver_timer_pan159_irq_handler = irq_handler;
|
||||
// Start Timer 0.
|
||||
TIMER_Start(TIMER0);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief 定时器0中断处理函数
|
||||
* @param[in] 无
|
||||
* @param[out] 无
|
||||
* @return 无
|
||||
* @history - V1.0, 2017-03-07, xiaoguolin, first implementation.
|
||||
******************************************************************************/
|
||||
void TMR0_IRQHandler(void)
|
||||
{
|
||||
TIMER_ClearIntFlag(TIMER0);
|
||||
if(__s_lib_driver_timer_pan159_irq_handler){
|
||||
__s_lib_driver_timer_pan159_irq_handler();
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* @brief 定时�1初始化
|
||||
* @param[in] 无
|
||||
* @param[out] 无
|
||||
* @return 无
|
||||
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
|
||||
******************************************************************************/
|
||||
void timer1_pan159_init(uint32_t freq, void(*irq_handler)(void))
|
||||
{
|
||||
CLK_EnableModuleClock(TMR1_MODULE);
|
||||
TIMER_Open(TIMER1, TIMER_PERIODIC_MODE, freq);
|
||||
// Enable timer interrupt
|
||||
if(irq_handler){
|
||||
TIMER_EnableInt(TIMER1);
|
||||
NVIC_EnableIRQ(TMR1_IRQn);
|
||||
NVIC_SetPriority(TMR1_IRQn,2);
|
||||
}
|
||||
__s_lib_driver_timer1_pan159_irq_handler = irq_handler;
|
||||
// Start Timer 0.
|
||||
TIMER_Start(TIMER1);
|
||||
}
|
||||
/*******************************************************************************
|
||||
* @brief 定时器1中断处理函数
|
||||
* @param[in] 无
|
||||
* @param[out] 无
|
||||
* @return 无
|
||||
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
|
||||
******************************************************************************/
|
||||
void TMR1_IRQHandler(void)
|
||||
{
|
||||
TIMER_ClearIntFlag(TIMER1);
|
||||
if(__s_lib_driver_timer1_pan159_irq_handler){
|
||||
__s_lib_driver_timer1_pan159_irq_handler();
|
||||
}
|
||||
}
|
||||
|
||||
void DrvTimer0_SetTimer(uint32_t usec)
|
||||
{
|
||||
TIMER_Close(TIMER0);
|
||||
TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, usec);
|
||||
TIMER_EnableInt(TIMER0);
|
||||
//NVIC_EnableIRQ(TMR0_IRQn);
|
||||
//NVIC_SetPriority(TMR0_IRQn,2);
|
||||
TIMER_Start(TIMER0);
|
||||
}
|
||||
|
||||
void DrvTimer1_SetTimer(uint32_t usec)
|
||||
{
|
||||
TIMER_Close(TIMER1);
|
||||
TIMER_Open(TIMER1, TIMER_PERIODIC_MODE, usec);
|
||||
TIMER_EnableInt(TIMER1);
|
||||
//NVIC_EnableIRQ(TMR1_IRQn);
|
||||
//NVIC_SetPriority(TMR1_IRQn,2);
|
||||
TIMER_Start(TIMER1);
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file lib_driver_timer_pan159.c
|
||||
* @brief ¶¨Ê±Æ÷
|
||||
*
|
||||
* @history - V1.0, 2017-11-16, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
#ifndef __LIB_DRIVER_TIMER_PAN159_H
|
||||
#define __LIB_DRIVER_TIMER_PAN159_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
|
||||
#include "Mini58Series.h"
|
||||
|
||||
void timer_pan159_init(uint32_t freq, void(*irq_handler)(void));
|
||||
void timer1_pan159_init(uint32_t freq, void(*irq_handler)(void));
|
||||
void DrvTimer0_SetTimer(uint32_t usec);
|
||||
void DrvTimer1_SetTimer(uint32_t usec);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif //__LIB_DRIVER_TIMER_PAN159_H
|
||||
@@ -0,0 +1,69 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file lib_driver_uart_pan159.c
|
||||
* @brief PAN159 hardware uartÇý¶¯
|
||||
*
|
||||
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
|
||||
*******************************************************************************/
|
||||
#include "lib_driver_uart_pan159.h"
|
||||
#include "string.h"
|
||||
|
||||
uint8_t uartRcvBuffer[RX_BUF_SIZE],wptr,u8InChar,uartTxBuffer[TX_BUF_SIZE];
|
||||
uint16_t u16Count;
|
||||
uint16_t u16TxDataLen;
|
||||
/*---------------------------------------------------------------------------------------------------------*/
|
||||
/* ISR to handle UART Channel 0 interrupt event */
|
||||
/*---------------------------------------------------------------------------------------------------------*/
|
||||
void UART0_IRQHandler(void)
|
||||
{
|
||||
uint32_t u32IntSts= UART0->INTSTS;
|
||||
if(u32IntSts & UART_INTSTS_RDAINT_Msk) {
|
||||
/* Get all the input characters */
|
||||
while(UART_IS_RX_READY(UART0)) {
|
||||
/* Get the character from UART Buffer */
|
||||
if(wptr < RX_BUF_SIZE) {
|
||||
uartRcvBuffer[wptr++] = UART_READ(UART0);
|
||||
}
|
||||
else{
|
||||
wptr = 0;
|
||||
uartRcvBuffer[wptr] = UART_READ(UART0);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(u32IntSts & UART_INTSTS_THREINT_Msk) {
|
||||
if(u16Count < u16TxDataLen && u16TxDataLen != 0){
|
||||
u8InChar = uartTxBuffer[u16Count++];
|
||||
UART_WRITE(UART0,u8InChar);
|
||||
if(u16Count >= u16TxDataLen){
|
||||
u16TxDataLen = 0;
|
||||
u16Count = 0;
|
||||
UART_DISABLE_INT(UART0,UART_INTEN_THREIEN_Msk);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void uart_init_pan159(void)
|
||||
{
|
||||
CLK_EnableModuleClock(UART0_MODULE);
|
||||
// SYS->P4_MFP = SYS_MFP_P46_UART1_RXD | SYS_MFP_P47_UART1_TXD;
|
||||
SYS->P5_MFP = SYS_MFP_P51_UART0_RXD | SYS_MFP_P50_UART0_TXD;
|
||||
GPIO_ENABLE_DIGITAL_PATH(P5,(1<<1));
|
||||
// UART_Open(UART1, 115200);
|
||||
UART_Open(UART0, 115200);
|
||||
UART_ENABLE_INT(UART0, (UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk /*| UART_INTEN_THREIEN_Msk*/));
|
||||
NVIC_EnableIRQ(UART0_IRQn);
|
||||
}
|
||||
|
||||
void uart_send(uint8_t *buff,uint16_t len)
|
||||
{
|
||||
u16TxDataLen = len;
|
||||
u16Count = 0;
|
||||
memcpy(&uartTxBuffer[0],&buff[0],len);
|
||||
UART_ENABLE_INT(UART0,UART_INTEN_THREIEN_Msk);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file lib_driver_uart_pan159.c
|
||||
* @brief PAN159 hardware uartÇý¶¯
|
||||
*
|
||||
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
|
||||
*******************************************************************************/
|
||||
#ifndef __LIB_DIRVER_UART_PAN159_H
|
||||
#define __LIB_DIRVER_UART_PAN159_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
|
||||
#include "Mini58Series.h"
|
||||
#define RX_BUF_SIZE 32
|
||||
#define TX_BUF_SIZE 32
|
||||
//#define DEBUG_PORT UART1
|
||||
void uart_init_pan159(void);
|
||||
void uart_send(uint8_t *buff,uint16_t len);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __LIB_DIRVER_UART_PAN159_H
|
||||
@@ -0,0 +1,44 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file lib_driver_wdt_pan159.c
|
||||
* @brief PAN159 hardware wdtÇý¶¯
|
||||
*
|
||||
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
|
||||
*******************************************************************************/
|
||||
#include "lib_driver_wdt_pan159.h"
|
||||
/**
|
||||
* @brief This function make WDT module start counting with different time-out interval
|
||||
* @param[in] u32TimeoutInterval Time-out interval period of WDT module. Valid values are:
|
||||
* - \ref WDT_TIMEOUT_2POW4 -- 1.6MS
|
||||
* - \ref WDT_TIMEOUT_2POW6 -- 6.4MS
|
||||
* - \ref WDT_TIMEOUT_2POW8 -- 25.6MS
|
||||
* - \ref WDT_TIMEOUT_2POW10 -- 102.4MS
|
||||
* - \ref WDT_TIMEOUT_2POW12 -- 409.6MS
|
||||
* - \ref WDT_TIMEOUT_2POW14 -- 1.6384S
|
||||
* - \ref WDT_TIMEOUT_2POW16 -- 6.5536S
|
||||
* - \ref WDT_TIMEOUT_2POW18 -- 26.214S
|
||||
*/
|
||||
void DrvWDT_Init(uint32_t u32TimeoutInterval)
|
||||
{
|
||||
SYS_UnlockReg();
|
||||
CLK->CLKSEL1 |= 0x00000003;
|
||||
SystemCoreClockUpdate();
|
||||
WDT->CTL = u32TimeoutInterval | WDT_CTL_WDTEN_Msk |
|
||||
(TRUE << WDT_CTL_RSTEN_Pos) |
|
||||
(FALSE << WDT_CTL_WKEN_Pos);
|
||||
WDT->ALTCTL = WDT_RESET_DELAY_3CLK;
|
||||
}
|
||||
|
||||
void DrvWDT_Feed(void)
|
||||
{
|
||||
WDT_RESET_COUNTER();
|
||||
}
|
||||
|
||||
void DrvWDT_close(void)
|
||||
{
|
||||
WDT->CTL = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2018 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file lib_driver_wdt_pan159.c
|
||||
* @brief PAN159 hardware wdtÇý¶¯
|
||||
*
|
||||
* @history - V1.0, 2018-01-19, huoweibin, first implementation.
|
||||
*******************************************************************************/
|
||||
#ifndef __LIB_DIRVER_WDT_PAN159_H
|
||||
#define __LIB_DIRVER_WDT_PAN159_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
|
||||
#include "Mini58Series.h"
|
||||
|
||||
void DrvWDT_Init(uint32_t ms);
|
||||
void DrvWDT_Feed(void);
|
||||
void DrvWDT_close(void);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __LIB_DIRVER_WDT_PAN159_H
|
||||
@@ -0,0 +1,289 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file drv_xn297l.c
|
||||
* @brief XN297L RF驱动
|
||||
*
|
||||
* @history - V1.0, 2017-03-06, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
#include "lib_driver_xn297l.h"
|
||||
|
||||
/******************************************************************************/
|
||||
//void rf_write_reg(uint8_t reg,uint8_t data);
|
||||
//rf写寄存器函数
|
||||
//input:uint8_t reg,寄存器地址;uint8_t data:需要写入寄存器的值
|
||||
//output:无
|
||||
/******************************************************************************/
|
||||
void xn297l_write_reg(uint8_t reg,uint8_t data)
|
||||
{
|
||||
rfspi_cs(0); //使能片选
|
||||
rfspi_rwc(reg); //写入的寄存器的地址
|
||||
rfspi_rwc(data); //写入的寄存器的值
|
||||
rfspi_cs(1); //禁能片选
|
||||
}
|
||||
/******************************************************************************/
|
||||
//uint8_t rf_read_reg(uint8_t reg);
|
||||
//rf读寄存器函数
|
||||
//input:uint8_t reg,需要读取的寄存器
|
||||
//output:寄存器的值
|
||||
/******************************************************************************/
|
||||
uint8_t xn297l_read_reg(uint8_t reg)
|
||||
{
|
||||
uint8_t tmp;
|
||||
rfspi_cs(0); //使能片选
|
||||
rfspi_rwc(reg); //写入的寄存器的地址
|
||||
tmp = rfspi_rwc(0x00); //读取寄存器的值
|
||||
rfspi_cs(1); //禁能片选
|
||||
return tmp;
|
||||
}
|
||||
/******************************************************************************/
|
||||
//void rf_write_buf(uint8_t reg,uint8_t *pbuf,uint8_t length);
|
||||
//rf写缓冲函数
|
||||
//input:uint8_t reg,写入寄存器的地址;uint8_t *pbuf,写入数组的首地址;uint8_t length,写入数据的长度
|
||||
//output:无
|
||||
/******************************************************************************/
|
||||
void xn297l_write_buf(uint8_t reg,uint8_t *pbuf,uint8_t length)
|
||||
{
|
||||
uint8_t i;
|
||||
rfspi_cs(0); //使能片选
|
||||
rfspi_rwc(reg);
|
||||
for(i = 0;i < length; i++)
|
||||
{
|
||||
rfspi_rwc(pbuf[i]); //写入数据
|
||||
}
|
||||
rfspi_cs(1); //禁能片选
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
//void rf_read_buf(uint8_t reg,uint8_t *pbuf,uint8_t length);
|
||||
//rf读缓冲函数
|
||||
//input:uint8_t reg,读出寄存器的地址;uint8_t *pbuf,读出缓冲数组的首地址;uint8_t length,读出数据的长度
|
||||
//output:无
|
||||
/******************************************************************************/
|
||||
void xn297l_read_buf(uint8_t reg, uint8_t *pbuf, uint8_t length)
|
||||
{
|
||||
uint8_t i;
|
||||
rfspi_cs(0); //使能片选
|
||||
rfspi_rwc(reg);
|
||||
for(i = 0; i < length; i++)
|
||||
{
|
||||
pbuf[i] = rfspi_rwc(0x00); //读取数据
|
||||
}
|
||||
rfspi_cs(1); //禁能片选
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
//void rf_tx_mode(void);
|
||||
//XN297L设置为发送模式
|
||||
//input:无
|
||||
//output:无
|
||||
/******************************************************************************/
|
||||
void xn297l_tx_mode(void)
|
||||
{
|
||||
// uint8_t rf_cal_data[] = {0xF6,0x37,0x5D};
|
||||
// rf_write_buf(W_REGISTER + RF_CAL,rf_cal_data, sizeof(rf_cal_data));//设置RF_CAL
|
||||
xn297l_write_reg(W_REGISTER + CONFIG,0x8E); // rf设置为发送模式
|
||||
clear_CE();
|
||||
delay_us(20);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
//void rf_rx_mode(void);
|
||||
//XN297L设置为接收模式
|
||||
//input:无
|
||||
//output:无
|
||||
/******************************************************************************/
|
||||
void xn297l_rx_mode(void)
|
||||
{
|
||||
// uint8_t rf_cal_data[] = {0x06,0x37,0x5D};
|
||||
// rf_write_buf(W_REGISTER + RF_CAL,rf_cal_data, sizeof(rf_cal_data));//设置RF_CAL
|
||||
xn297l_write_reg(W_REGISTER + CONFIG,0X8F); // rf设置为接收模式
|
||||
set_CE();
|
||||
//delay_ms(1);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
//void rf_get_status(void);
|
||||
//XN297L获取状态信息
|
||||
//input:无
|
||||
//output:状态寄存器的值
|
||||
/******************************************************************************/
|
||||
uint8_t xn297l_get_status(void)
|
||||
{
|
||||
return xn297l_read_reg(RF_STATUS)&0x70; //读取状态值
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
//void rf_clear_status(void);
|
||||
//XN297L清除状态信息
|
||||
//input:无
|
||||
//output:无
|
||||
/******************************************************************************/
|
||||
void xn297l_clear_status(void)
|
||||
{
|
||||
xn297l_write_reg(W_REGISTER + RF_STATUS,0x70);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
//void rf_clear_FIFO(void);
|
||||
//XN297L清除缓冲
|
||||
//input:无
|
||||
//output:无
|
||||
/******************************************************************************/
|
||||
void xn297l_clear_fifo(void)
|
||||
{
|
||||
xn297l_write_reg(FLUSH_TX, 0); //清除发送缓冲
|
||||
xn297l_write_reg(FLUSH_RX, 0); //清除接收缓冲
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
//void rf_set_channel(uint8_t channel);
|
||||
//XN297L设置通信信道
|
||||
//input:uint8_t channel,设置的通信信道
|
||||
//output:无
|
||||
/******************************************************************************/
|
||||
void xn297l_set_channel(uint8_t channel)
|
||||
{
|
||||
// current_channel = channel;
|
||||
xn297l_write_reg(W_REGISTER + RF_CH, channel);
|
||||
}
|
||||
/******************************************************************************/
|
||||
//void rf_set_addr(uint8_t reg,uint8_t *rf_addr_array);
|
||||
//XN297L设置通信地址
|
||||
//input:uint8_t reg,需要设置的寄存器,uint8_t *rf_addr_array,设置的地址
|
||||
//output:无
|
||||
/******************************************************************************/
|
||||
void xn297l_set_addr(uint8_t reg,uint8_t *rf_addr_array,uint8_t addr_len)
|
||||
{
|
||||
xn297l_write_buf(W_REGISTER + reg,rf_addr_array, addr_len);//设置地址
|
||||
}
|
||||
/******************************************************************************/
|
||||
//uint8_t rf_tx_data(uint8_t *data, uint8_t length);
|
||||
//XN297L发送数据
|
||||
//input:uint8_t *data,发送数据数组的首地址;uint8_t length发送数据的长度
|
||||
//output:发送状态值
|
||||
/******************************************************************************/
|
||||
void xn297l_tx_data(uint8_t *data, uint8_t length)
|
||||
{
|
||||
set_CE();
|
||||
delay_us(100);
|
||||
xn297l_write_buf(W_TX_PAYLOAD,data,length); //发送数据
|
||||
while(IRQ_STATUS);
|
||||
xn297l_clear_status(); //清除状态
|
||||
xn297l_write_reg(FLUSH_TX,0); //清除发送缓冲
|
||||
clear_CE();
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
//uint8_t rf_rx_data(uint8_t *data,uint8_t length);
|
||||
//rf接收函数
|
||||
//input:uint8_t *data,接收数据数组首地址;uint8_t length:接收数据的长度
|
||||
//output:接收正确与否标志
|
||||
/******************************************************************************/
|
||||
uint8_t xn297l_rx_data(uint8_t *data,uint8_t length)
|
||||
{
|
||||
if(IRQ_STATUS)
|
||||
{
|
||||
return 0; //等待接收
|
||||
}
|
||||
xn297l_read_buf(R_RX_PAYLOAD,data,length); //接收数据
|
||||
xn297l_write_reg(FLUSH_RX,0); //清除接收缓冲
|
||||
xn297l_clear_status(); //清除状态
|
||||
return 1;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
//void rf_init(void);
|
||||
//rf初始化函数,执行一些初始化操作
|
||||
//input:无
|
||||
//output:无
|
||||
/******************************************************************************/
|
||||
void rf_init(void)
|
||||
{
|
||||
uint8_t addr[] = {0x23,0x23,0x23};
|
||||
rfspi_init();
|
||||
xn297l_init(addr,3,20,13,XN297L_RF_POWER_P_5|XN297L_RF_DATA_RATE_1M);
|
||||
xn297l_rx_mode();
|
||||
}
|
||||
|
||||
void xn297l_init(uint8_t* addr,uint8_t addr_len,uint8_t chn,uint8_t payload,uint8_t rate_power)
|
||||
{
|
||||
#if ((DATA_RATE==DR_1M) || (DATA_RATE==DR_2M))
|
||||
uint8_t BB_cal_data[] = {0x12,0xED,0x67,0x9C,0x46};
|
||||
uint8_t rf_cal_data[] = {0xF6,0x3F,0x5D};
|
||||
uint8_t rf_cal2_data[] = {0x45,0x21,0xEF,0x2C,0x5A,0x40};
|
||||
uint8_t Dem_cal_data[] = {0x01};
|
||||
uint8_t Dem_cal2_data[] = {0x0B,0xDF,0x02};
|
||||
#elif (DATA_RATE==DR_250K)
|
||||
uint8_t BB_cal_data[] = {0x12,0xEC,0x6F,0xA1,0x46};
|
||||
uint8_t rf_cal_data[] = {0xF6,0x3F,0x5D};
|
||||
uint8_t rf_cal2_data[] = {0xD5,0x21,0xEB,0x2C,0x5A,0x40};
|
||||
uint8_t Dem_cal_data[] = {0x1F};
|
||||
uint8_t Dem_cal2_data[] = {0x0B,0xDF,0x02};
|
||||
#endif
|
||||
|
||||
xn297l_write_reg(RST_FSPI,0x5A); //芯片软复位
|
||||
xn297l_write_reg(RST_FSPI,0XA5);
|
||||
delay_ms(1);
|
||||
xn297l_clear_fifo();//清除缓冲
|
||||
xn297l_clear_status(); //清除状态寄存器
|
||||
if(payload < 33)
|
||||
{
|
||||
#if(CE_TYPE==CE_HARDWARE_MODE)
|
||||
xn297l_write_reg(W_REGISTER +FEATURE, 0x00); //32字节数据,使能硬件CE
|
||||
#else
|
||||
xn297l_write_reg(W_REGISTER +FEATURE, 0x20); //32字节数据,使能软件CE
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
#if(CE_TYPE==CE_HARDWARE_MODE)
|
||||
xn297l_write_reg(W_REGISTER +FEATURE, 0x18); //64字节数据,使能硬件CE
|
||||
#else
|
||||
xn297l_write_reg(W_REGISTER +FEATURE, 0x38); //64字节数据,使能软件CE
|
||||
#endif
|
||||
}
|
||||
|
||||
clear_CE();
|
||||
|
||||
xn297l_write_reg(W_REGISTER + EN_RXADDR,0x03); //使能接收通道0通道1
|
||||
xn297l_write_reg(W_REGISTER + SETUP_AW,addr_len-2); //[1-3] = [3-5]
|
||||
xn297l_write_reg(W_REGISTER + RF_CH,chn); //设置接收信道
|
||||
xn297l_write_reg(W_REGISTER + RX_PW_P0,payload); //设置接收数据宽度,即Payload宽度
|
||||
xn297l_write_reg(W_REGISTER + RX_PW_P1,payload); //设置接收数据宽度,即Payload宽度
|
||||
xn297l_write_buf(W_REGISTER + TX_ADDR,addr, addr_len); //设置发送地址
|
||||
xn297l_write_buf(W_REGISTER + RX_ADDR_P0,addr, addr_len); //设置接收地址
|
||||
xn297l_write_buf(W_REGISTER + BB_CAL,BB_cal_data, sizeof(BB_cal_data)); //设置BB_CAL
|
||||
xn297l_write_buf(W_REGISTER + RF_CAL2,rf_cal2_data, sizeof(rf_cal2_data)); //设置RF_CAL2
|
||||
xn297l_write_buf(W_REGISTER + DEM_CAL,Dem_cal_data, sizeof(Dem_cal_data)); //设置DEM_CAL
|
||||
xn297l_write_buf(W_REGISTER + RF_CAL,rf_cal_data, sizeof(rf_cal_data)); //设置RF_CAL
|
||||
xn297l_write_buf(W_REGISTER + DEM_CAL2,Dem_cal2_data,sizeof(Dem_cal2_data));//设置DEM_CAL2
|
||||
xn297l_write_reg(W_REGISTER + DYNPD, 0x00); //禁止动态Payload
|
||||
xn297l_write_reg(W_REGISTER + RF_SETUP,rate_power); //设置发射功率和速率
|
||||
#if(TRANSMIT_TYPE == TRANS_ENHANCE_MODE) //设置为增强模式
|
||||
xn297l_write_reg(W_REGISTER + SETUP_RETR,0x03); //使能三次重发
|
||||
xn297l_write_reg(W_REGISTER + EN_AA, 0x01); //使能自动应答
|
||||
#elif(TRANSMIT_TYPE == TRANS_NORMAL_MODE) //设置为普通模式
|
||||
xn297l_write_reg(W_REGISTER + SETUP_RETR,0x00); //禁止重发
|
||||
xn297l_write_reg(W_REGISTER + EN_AA, 0x00); //禁止自动应答
|
||||
#endif
|
||||
}
|
||||
/******************************************************************************/
|
||||
//单载波模式
|
||||
/******************************************************************************/
|
||||
void RF_Carrier( uint8_t ucChannel_Set)
|
||||
{
|
||||
uint8_t BB_cal_data[] = {0x0A,0x6D,0x67,0x9C,0x46};
|
||||
uint8_t RF_cal_data[] = {0xF6,0x37,0x5D};
|
||||
uint8_t RF_cal2_data[] = {0x45,0x21,0xEF,0xAC,0x5A,0x50};
|
||||
uint8_t Dem_cal_data[] = {0xE1};
|
||||
uint8_t Dem_cal2_data[] = {0x0B,0xDF,0x02};
|
||||
xn297l_write_reg(W_REGISTER + RF_CH,ucChannel_Set);
|
||||
xn297l_write_reg(W_REGISTER + RF_SETUP, 0x3F); //13dbm
|
||||
xn297l_write_buf(W_REGISTER + BB_CAL, BB_cal_data, sizeof(BB_cal_data));
|
||||
xn297l_write_buf(W_REGISTER + RF_CAL2, RF_cal2_data, sizeof(RF_cal2_data));
|
||||
xn297l_write_buf(W_REGISTER + DEM_CAL, Dem_cal_data, sizeof(Dem_cal_data));
|
||||
xn297l_write_buf(W_REGISTER + RF_CAL, RF_cal_data, sizeof(RF_cal_data));
|
||||
xn297l_write_buf(W_REGISTER + DEM_CAL2, Dem_cal2_data,sizeof(Dem_cal2_data));
|
||||
}
|
||||
@@ -0,0 +1,180 @@
|
||||
/*******************************************************************************
|
||||
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @file drv_xn297l.h
|
||||
* @brief XN297L RF驱动
|
||||
*
|
||||
* @history - V1.0, 2017-03-06, xiaoguolin, first implementation.
|
||||
*******************************************************************************/
|
||||
#ifndef __DRV_XN297L_H
|
||||
#define __DRV_XN297L_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
|
||||
#include "lib_driver_delay_pan159.h"
|
||||
#include "lib_driver_rfspi_pan159.h"
|
||||
|
||||
#define XN297L_RF_DATA_RATE_1M 0x00
|
||||
#define XN297L_RF_DATA_RATE_2M 0x40
|
||||
#define XN297L_RF_DATA_RATE_250K 0xC0
|
||||
|
||||
#define USER_RF_POWER (CONF_RF_REMOTE_POWER|CONF_RF_REMOTE_RATE)
|
||||
//#define MONITOR_RF_POWER (CONF_RF_CONGLEX_POWER|CONF_RF_DONGLEX_RATE)
|
||||
|
||||
#define TRANS_ENHANCE_MODE 1 //发送增强模式
|
||||
#define TRANS_NORMAL_MODE 2 //发送普通模式
|
||||
#define TRANSMIT_TYPE TRANS_NORMAL_MODE //初始设置为普通模式
|
||||
|
||||
#define RX_DR_FLAG 0x40 // 接收中断标志位
|
||||
#define TX_DS_FLAG 0x20 // 发送完成中断标志位
|
||||
#define RX_TX_FLAG 0x60 // 发送接收完成中断标志位,ack_payload 模式下使用
|
||||
#define MAX_RT_FLAG 0x10 // 发送重传超时中断标志位
|
||||
|
||||
#define XN297L_RF_POWER_P_11 0x27 /** 11dBm */
|
||||
#define XN297L_RF_POWER_P_10 0x26 /** 10dBm */
|
||||
#define XN297L_RF_POWER_P_9 0x15 /** 9dBm */
|
||||
#define XN297L_RF_POWER_P_5 0x2c /** 5dBm */
|
||||
#define XN297L_RF_POWER_P_4 0x14 /** 4dBm */
|
||||
#define XN297L_RF_POWER_N_1 0x2A /** -1dBm */
|
||||
#define XN297L_RF_POWER_N_9 0x29 /** -9dBm */
|
||||
#define XN297L_RF_POWER_N_10 0x19 /** -10dBm */
|
||||
#define XN297L_RF_POWER_N_23 0x30 /** -23dBm */
|
||||
|
||||
#if( (DATA_RATE ==DR_1M) || (DATA_RATE==DR_2M) )
|
||||
|
||||
#define rf7dBm 0X0D // 7dBm 只能用于1M过安规用
|
||||
#define rf6dBm 0X06 // 6dBm 只能用于1M过安规用
|
||||
#define rf3dBm 0X0C // 3dBm 只能用于1M过安规用
|
||||
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//XN297L寄存器操作命令
|
||||
#define RF_READ_REG 0x00 //读配置寄存器,低5位为寄存器地址
|
||||
#define RF_WRITE_REG 0x20 //写配置寄存器,低5位为寄存器地址
|
||||
#define W_REGISTER 0x20 //写配置寄存器,低5位为寄存器地址
|
||||
#define R_RX_PAYLOAD 0x61 //读RX有效数据, 1~32字节
|
||||
#define W_TX_PAYLOAD 0xA0 //写TX有效数据,1~32字节
|
||||
#define FLUSH_TX 0xE1 //清除TX FIFO寄存器.发射模式下用
|
||||
#define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用
|
||||
#define REUSE_TX_PL 0xE3 //重新使用上一包数据,CE为高,数据包被不断发送.
|
||||
#define NOP 0xFF //空操作,可以用来读状态寄存器
|
||||
|
||||
|
||||
#define ACTIVATE 0x50 //ACTIVATE
|
||||
#define DEACTIVATE 0x50 //DEACTIVATE
|
||||
#define R_RX_PL_WID 0x60 //Read width of RX data
|
||||
#define W_ACK_PAYLOAD 0xA8 //Data with ACK
|
||||
#define W_TX_PAYLOAD_NOACK 0xB0 //TX Payload no ACK Request
|
||||
#define CE_FSPI_ON 0xFD // CE HIGH
|
||||
#define CE_FSPI_OFF 0xFC // CE LOW
|
||||
#define RST_FSPI 0x53 // RESET
|
||||
|
||||
|
||||
//SPI(XN297L)寄存器地址
|
||||
#define CONFIG 0x00 //配置寄存器地址;bit0:1接收模式,0发射模式;bit1:电选择;bit2:CRC模式;bit3:CRC使能;
|
||||
//bit4:中断MAX_RT(达到最大重发次数中断)使能;bit5:中断TX_DS使能;bit6:中断RX_DR使能
|
||||
#define EN_AA 0x01 //使能自动应答功能 bit0~5,对应通道0~5
|
||||
#define EN_RXADDR 0x02 //接收地址允许,bit0~5,对应通道0~5
|
||||
#define SETUP_AW 0x03 //设置地址宽度(所有数据通道):bit1,0:00,3字节;01,4字节;02,5字节;
|
||||
#define SETUP_RETR 0x04 //建立自动重发;bit3:0,自动重发计数器;bit7:4,自动重发延时 250*x+86us
|
||||
#define RF_CH 0x05 //rf通道,bit6:0,工作通道频率;
|
||||
#define RF_SETUP 0x06 //rf寄存器;bit3:传输速率(0:1Mbps,1:2Mbps);bit2:1,发射功率;bit0:低噪声放大器增益
|
||||
#define RF_STATUS 0x07 //状态寄存器;bit0:TX FIFO满标志;bit3:1,接收数据通道号(最大:6);bit4,达到最多次重发
|
||||
//bit5:数据发送完成中断;bit6:接收数据中断;
|
||||
#define MAX_TX 0x10 //达到最大发送次数中断
|
||||
#define TX_OK 0x20 //TX发送完成中断
|
||||
#define RX_OK 0x40 //接收到数据中断
|
||||
|
||||
#define OBSERVE_TX 0x08 //传输状态寄存器,bit7:4,数据包丢失计数器;bit3:0,重发计数器
|
||||
#define CD 0x09 //载波检测寄存器,bit0,载波检测;
|
||||
#define RX_ADDR_P0 0x0A //数据通道0接收地址,最大长度5个字节,低字节在前
|
||||
#define RX_ADDR_P1 0x0B //数据通道1接收地址,最大长度5个字节,低字节在前
|
||||
#define RX_ADDR_P2 0x0C //数据通道2接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
|
||||
#define RX_ADDR_P3 0x0D //数据通道3接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
|
||||
#define RX_ADDR_P4 0x0E //数据通道4接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
|
||||
#define RX_ADDR_P5 0x0F //数据通道5接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
|
||||
#define TX_ADDR 0x10 //发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与此地址相等
|
||||
#define RX_PW_P0 0x11 //接收数据通道0有效数据宽度(1~32字节),设置为0则非法
|
||||
#define RX_PW_P1 0x12 //接收数据通道1有效数据宽度(1~32字节),设置为0则非法
|
||||
#define RX_PW_P2 0x13 //接收数据通道2有效数据宽度(1~32字节),设置为0则非法
|
||||
#define RX_PW_P3 0x14 //接收数据通道3有效数据宽度(1~32字节),设置为0则非法
|
||||
#define RX_PW_P4 0x15 //接收数据通道4有效数据宽度(1~32字节),设置为0则非法
|
||||
#define RX_PW_P5 0x16 //接收数据通道5有效数据宽度(1~32字节),设置为0则非法
|
||||
#define FIFO_STATUS 0x17 //FIFO状态寄存器;bit0,RX FIFO寄存器空标志;bit1,RX FIFO满标志;bit2,3,保留
|
||||
//bit4,TX FIFO空标志;bit5,TX FIFO满标志;bit6,1,循环发送上一数据包.0,不循环;
|
||||
|
||||
#define DEM_CAL 0x19
|
||||
#define RF_CAL2 0x1A
|
||||
#define DEM_CAL2 0x1B
|
||||
#define DYNPD 0x1C
|
||||
#define FEATURE 0x1D
|
||||
#define RF_CAL 0x1E
|
||||
#define BB_CAL 0x1F
|
||||
|
||||
|
||||
#define USER_CHN CONF_RF_REMOTE_CHN //通信信道设置
|
||||
#define MONITOR_CHN CONF_RF_DONGLEX_CHN //监测通信信道设置
|
||||
#define PAYLOAD_WIDTH CONF_RF_REMOTE_RX_PAYLOAD_WIDTH //XN297L发送接收数据宽度定义
|
||||
#define MONITOR_WIDTH CONF_RF_DONGLEX_TX_PAYLOAD_WIDTH
|
||||
//#define TX_ADR_WIDTH 5 //5字节的地址宽度
|
||||
//#define RX_ADR_WIDTH 5 //5字节的地址宽度
|
||||
//#define TX_PLOAD_WIDTH 32 //32字节的用户数据宽度
|
||||
//#define RX_PLOAD_WIDTH 32 //32字节的用户数据宽度
|
||||
|
||||
#define CE_SOFTWARE_MODE 1 //CE软件模式
|
||||
#define CE_HARDWARE_MODE 2 //CE硬件模式
|
||||
#define CE_TYPE CE_HARDWARE_MODE //设置为硬件模式
|
||||
|
||||
#define IRQ_STATUS rfspi_irq()
|
||||
#define CSN_HIGH P01=1
|
||||
#define CSN_LOW P01=0
|
||||
|
||||
//#if 0
|
||||
////PAN163
|
||||
//#if(CE_TYPE==CE_HARDWARE_MODE)
|
||||
// #define set_CE() (P02=1)
|
||||
// #define clear_CE() (P02=0)
|
||||
//#else
|
||||
// #define set_CE() (xn297l_write_reg(CE_FSPI_ON, 0))//内部置位CE
|
||||
// #define clear_CE() (xn297l_write_reg(CE_FSPI_OFF, 0))//内部拉低CE
|
||||
//#endif
|
||||
//#endif
|
||||
////PAN159
|
||||
//#define set_CE() (xn297l_write_reg(CE_FSPI_ON, 0))//内部置位CE
|
||||
//#define clear_CE() (xn297l_write_reg(CE_FSPI_OFF, 0))//内部拉低CE
|
||||
|
||||
|
||||
#if(CE_TYPE==CE_HARDWARE_MODE)
|
||||
#define set_CE() rfspi_ce(1)
|
||||
#define clear_CE() rfspi_ce(0)
|
||||
#else
|
||||
#define set_CE() (xn297l_write_reg(CE_FSPI_ON, 0))//内部置位CE
|
||||
#define clear_CE() (xn297l_write_reg(CE_FSPI_OFF, 0))//内部拉低CE
|
||||
#endif
|
||||
|
||||
void xn297l_write_reg(uint8_t reg,uint8_t data);//rf写寄存器函数
|
||||
uint8_t xn297l_read_reg(uint8_t reg);//rf读寄存器函数
|
||||
void xn297l_write_buf(uint8_t reg,uint8_t *pbuf,uint8_t length);//rf写缓冲函数
|
||||
void xn297l_read_buf(uint8_t reg,uint8_t *pbuf,uint8_t length);//rf读缓冲函数
|
||||
//void xn297l_init(void);//rf初始化
|
||||
void xn297l_init(uint8_t* addr,uint8_t addr_len,uint8_t chn,uint8_t payload,uint8_t rate_power);
|
||||
void xn297l_tx_mode(void);//XN297L设置为发送模式
|
||||
void xn297l_rx_mode(void);//XN297L设置为接收模式
|
||||
uint8_t xn297l_get_status(void);//XN297L获取状态信息
|
||||
void xn297l_clear_status(void);//XN297L清除状态信息
|
||||
void xn297l_clear_fifo(void);//XN297L清除缓冲
|
||||
void xn297l_set_channel(uint8_t channel);//XN297L设置通信信道
|
||||
void xn297l_tx_data(uint8_t *data, uint8_t length);//XN297L发送数据
|
||||
uint8_t xn297l_rx_data(uint8_t *data,uint8_t length);//rf接收函数
|
||||
void xn297l_set_addr(uint8_t reg,uint8_t *rf_addr_array,uint8_t addr_len);//rf设置通信地址
|
||||
void rf_init(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __DRV_XN297L_H
|
||||
Reference in New Issue
Block a user