精细化控制引脚开关

This commit is contained in:
nnhy 2015-09-05 03:56:03 +00:00
parent 320629b277
commit cb60c66c2c
3 changed files with 32 additions and 23 deletions

View File

@ -235,18 +235,15 @@ void NRF24L01::Init()
void NRF24L01::Init(Spi* spi, Pin ce, Pin irq, Pin power)
{
//if(irq != P0)
debug_printf("NRF24L01::Init CE=P%c%d IRQ=P%c%d POWER=P%c%d\r\n", _PIN_NAME(ce), _PIN_NAME(irq), _PIN_NAME(power));
//else
// debug_printf("NRF24L01::Init CE=P%c%d IRQ=P0\r\n", _PIN_NAME(ce));
debug_printf("NRF24L01::Init CE=P%c%d IRQ=P%c%d POWER=P%c%d\r\n", _PIN_NAME(ce), _PIN_NAME(irq), _PIN_NAME(power));
if(ce != P0)
{
// 拉高CE可以由待机模式切换到RX/TX模式
// 拉低CE由收发模式切换回来待机模式
_CE.OpenDrain = false;
_CE.Set(ce).Open();
_CE = false; // 开始让CE=0系统上电并打开电源寄存器后位于待机模式
_CE.Set(ce);
//_CE = false; // 开始让CE=0系统上电并打开电源寄存器后位于待机模式
}
if(irq != P0)
{
@ -254,19 +251,18 @@ void NRF24L01::Init(Spi* spi, Pin ce, Pin irq, Pin power)
//_IRQ->ShakeTime = 2;
_IRQ.Floating = false;
_IRQ.PuPd = InputPort::PuPd_UP;
_IRQ.Set(irq).Open();
_IRQ.Set(irq);
_IRQ.Register(OnIRQ, this);
}
if(power != P0)
{
Power.Set(power).Open();
debug_printf("打开物理电源开关\r\n");
Power.Set(power);
}
// 必须先赋值后面WriteReg需要用到
_spi = spi;
// 需要先打开SPI否则后面可能不能及时得到读数
/*// 需要先打开SPI否则后面可能不能及时得到读数
_spi->Open();
#if !DEBUG
TimeWheel tw(0, 100);
@ -275,7 +271,7 @@ void NRF24L01::Init(Spi* spi, Pin ce, Pin irq, Pin power)
// 初始化前必须先关闭电源。因为系统可能是重启,而模块并没有重启,还保留着上一次的参数
//!!! 重大突破当前版本程序烧写后无法触发IRQ中断但是重新上电以后可以中断而Reset也不能触发。并且发现只要模块带电寄存器参数不会改变。
SetPower(false);
SetPower(false);*/
}
NRF24L01::~NRF24L01()
@ -365,13 +361,7 @@ byte NRF24L01::WriteReg(byte reg, byte dat)
// 主要用于NRF与MCU是否正常连接
bool NRF24L01::Check(void)
{
if(!Power.Read())
{
Power = true;
debug_printf("打开物理电源开关\r\n");
}
// 检查并打开Spi
_spi->Open();
if(!Open()) return false;
//byte buf[5]={0xC2,0xC2,0xC2,0xC2,0xC2};
byte buf[5]={0xA5,0xA5,0xA5,0xA5,0xA5};
@ -798,6 +788,16 @@ void AutoOpenTask(void* param)
bool NRF24L01::OnOpen()
{
if(Power.Open() && !Power.Read())
{
Power = true;
debug_printf("打开物理电源开关\r\n");
}
_CE.Open();
_IRQ.Open();
// 检查并打开Spi
_spi->Open();
Error = 0;
// 配置完成以后,无需再次检查
@ -837,11 +837,14 @@ void NRF24L01::OnClose()
SetPower(false);
_spi->Close();
_CE.Close();
_IRQ.Close();
if(Power.Read())
{
Power = false;
debug_printf("关闭物理电源开关\r\n");
}
Power.Close();
}
// 从NRF的接收缓冲区中读出数据

View File

@ -11,11 +11,6 @@
class NRF24L01 : public ITransport
{
private:
Spi* _spi;
OutputPort _CE;
InputPort _IRQ;
OutputPort Power; // 设置控制2401电源的引脚 直接进行对2401的通断电操作以免死机对setPower无效
byte WriteBuf(byte reg, const byte *pBuf, byte bytes);
byte ReadBuf(byte reg, byte *pBuf, byte bytes);
byte ReadReg(byte reg);
@ -36,6 +31,11 @@ private:
void Init();
public:
Spi* _spi;
OutputPort _CE;
InputPort _IRQ;
OutputPort Power; // 设置控制2401电源的引脚 直接进行对2401的通断电操作以免死机对setPower无效
byte Channel; // 通讯频道。物理频率号在2400MHZ基础上加
byte Address[5]; // 通道0地址
byte Address1[5]; // 通道1地址

View File

@ -99,12 +99,14 @@ bool Port::Open()
#endif
Opened = true;
return true;
}
void Port::Close()
{
if(!Opened) return;
if(_Pin == P0) return;
// 先打开时钟才能配置
int gi = _Pin >> 4;
@ -316,6 +318,8 @@ ushort OutputPort::ReadGroup() // 整组读取
bool OutputPort::Read()
{
if(Empty()) return false;
// 转为bool时会转为0/1
bool rs = GPIO_ReadOutputData(Group) & PinBit;
return rs ^ Invert;
@ -323,6 +327,8 @@ bool OutputPort::Read()
bool OutputPort::ReadInput()
{
if(Empty()) return false;
bool rs = GPIO_ReadInputData(Group) & PinBit;
return rs ^ Invert;
}