Page 36 EMX用户手册:“通过可选的毛刺滤波器,可以在上升沿或下降沿激活中断。”然而,Redpine Signals RS9110-N-11-21数据表声明:“高电平,高电平触发。” 中断由WiFi设备触发。在C#代码中,如果我使用InterruptEdgeLevelHigh或InterruptEdgeLevelLow参数,我会收到参数异常。这没关系,因为它与EMX用户手册一致。如果我使用InterruptEdgeBoth,InterruptEdgeHigh或InterruptEdgeLow,我无法收到中断。我不确定这是否是因为该设备正在使用“高电平,高电平触发”。
如果RedPine被限制为“水平触发”,我是否能够通过Edge触发检测到它们的中断,或者中断检测是否绝对限制在Level?
以下是我用来测试触发器的代码的一部分:
public static void Main()
{
config = new SPI.Configuration((Cpu.Pin)EMX.Pin.IO2, false, 0, 0, false, true, 1000, SPI.SPI_module.SPI1);
SPI1 = new SPI(config);
WiFiReset = new OutputPort((Cpu.Pin)EMX.Pin.IO3, true);
WiFiInterrupt = new InterruptPort((Cpu.Pin)EMX.Pin.IO26, false, Port.ResistorMode.Disabled, Port.InterruptMode.InterruptEdgeHigh);
// "Interrupts can be activated on rising or falling edges with an optional glitch filter." Page 36 EMX User Manual.
// Redpine Datasheet: "Active high, level triggered."
// NETMF interrupt event: "If an InterruptEdgeLevelHigh or InterruptEdgeLevelLow interrupt event occurs, an application must call the ClearInterrupt method to re-enable this event."
WiFiInterrupt.OnInterrupt += new NativeEventHandler(WiFiInterrupt_OnInterrupt);
try
{
byte[] in_initialise = { 0x15, 0x00 }; //initialisation
byte[] out_initialise = new byte[2];
SPI1.WriteRead(in_initialise, out_initialise);
if (out_initialise[1] != 0x58) //SUCCESSFUL
{
WiFiReset.Write(false);
Thread.Sleep(1);
WiFiReset.Write(true);
SPI1.WriteRead(in_initialise, out_initialise);
}
if (out_initialise[1] == 0x58)
{
Debug.Print("WiFi is Initialised.");
WiFiInterrupt.ClearInterrupt();
intFlag = false;
byte[] in_bandStart = { 0x7c, 0x04, 0x10, 0x00, 0x02, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00 }; //Band
byte[] out_bandStart = new byte[20];
SPI1.WriteRead(in_bandStart, out_bandStart);
if (out_bandStart[19] == 0x58) //SUCCESSFUL
{
//Debug.Print("WiFi established Band Command Start.");
while (intFlag == false && delay < maxDelay)
{
++delay; //waiting for interrupt
SPI1.WriteRead(tx_data, rx_data);
if (rx_data[0] == 0x55)
break;
Thread.Sleep(1);
}
if (delay != maxDelay)
{
*****************************************************************************************************
static void WiFiInterrupt_OnInterrupt(uint data1, uint data2, DateTime time)
{
byte[] in_intStart = { 0x5c, 0x00, 0x10, 0x00 }; //Band Start
byte[] out_intStart = new byte[4];
SPI1.WriteRead(in_intStart, out_intStart);
intFlag = true;
intTime = time;
}
在第一个中断到期时,我已多次收到0x58确认收到(参见“等待中断”)。
Band Command Start
Send : 7c Recv : 00
Send : 04 Recv : 58
Send : 10 Recv : 58
Send : 00 Recv : 58
Send : 02 Recv : 58
Send : 18 Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 04 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Wait for interrupt
Interrupt received, Do master read
Send : 5c Recv : 00
Send : 00 Recv : 58
Send : 10 Recv : 58
Send : 00 Recv : 58
wait for start token
Send : Dummy 00 Recv : 58
Send : Dummy 00 Recv : 58
Send : Dummy 00 Recv : 55
Read descriptor is
Send : Dummy 00 Recv : 00
Send : Dummy 00 Recv : 97 .........Band Success Response
Send : Dummy 00 Recv : 00
Send : Dummy 00 Recv : 00
Send : Dummy 00 Recv : 00
Send : Dummy 00 Recv : 00
Send : Dummy 00 Recv : 00
Send : Dummy 00 Recv : 55
Send : Dummy 00 Recv : 88
Send : Dummy 00 Recv : 01
Send : Dummy 00 Recv : 00
Send : Dummy 00 Recv : 00
Send : Dummy 00 Recv : d1
Send : Dummy 00 Recv : 27
Send : Dummy 00 Recv : 04
Send : Dummy 00 Recv : 00
Band Response =97 Status=00
--------------------------------------------
Init Start
Send : 7c Recv : 80
Send : 04 Recv : 58
Send : 10 Recv : 58
Send : 00 Recv : 58
Send : 00 Recv : 58
Send : 10 Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
Send : 00 Dummy Recv : 58
非常感谢任何评论。
凯文。
答案 0 :(得分:0)
这种行为是正确的。您的模块仅基于没有边缘的水平过渡生成INT(图像上的蓝线)。 EMX设置为InterruptEdgeLow / Both / High只期望特定(或两边都是非特定的)边沿转换,并且因为只有级别发生了变化(没有边缘),所以不会生成INT。
此图像不太准确(蓝线上的转换可能需要更长的时间)但显示差异。
答案 1 :(得分:0)
redpine模块是水平触发的。 您应该能够配置中断处理程序以检测上升沿,当您从低转换为高时,将会引发上升沿。
但是,当有更多数据要服务时,该特定设备可能会使中断线保持高电平。因此,您需要在ISR结束时轮询中断线,并且只有在发现中断时才会确认中断。
这样做可以让你的中断再次触发。