sp_who shows a point-in-time snaphost of current spid activity.
To know if the process is really doing nothing (ie, hung?) you need to take a couple snapshots of cpu/disk activity. While you can do this by querying master..sysprocesses, I prefer to query master..monProcessActivity and then see if the cpu/physicalIO/logicalIO counters are changing between samples.
You can also try taking a couple snapshots of master..monProcessObject to see if the spid is actively working a query; again, look for changes logical/physical read counts.
If you understand wait states you can also try querying master..monProcessWaits.
=====================
select * from master..monProcessActivity where SPID = <spid>
select * from master..monProcessObject where SPID = <spid>
select * from master..monProcessWaits where SPID = <spid>
go
waitfor delay "00:00:15"
go
select * from master..monProcessActivity where SPID = <spid>
select * from master..monProcessObject where SPID = <spid>
select * from master..monProcessWaits where SPID = <spid>
go
=====================
If you see counters (cpu, logical/physical IOs) increasing then you know the spid is not hung/doing-nothing. If said counters are not moving, or moving very slowly, then those wait states that show increases in wait time are a good indication of what the process is waiting for.